在使用 Java Stream API 的 Collectors.toMap
方法时,如果存在重复的 key,则默认情况下会抛出 IllegalStateException
。为了处理重复的 key,你可以提供一个合并函数(merge function)作为 Collectors.toMap
的第三个参数,这个函数定义了如何处理重复的 key。
以下是一个示例,演示了当存在重复 key 时如何使用合并函数:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<Item> items = List.of(
new Item("key1", "value1"),
new Item("key2", "value2"),
new Item("key1", "value3")
);
Map<String, String> itemMap = items.stream()
.collect(Collectors.toMap(
Item::getKey,
Item::getValue,
(value1, value2) -> value1 + ", " + value2
));
itemMap.forEach((key, value) -> System.out.println(key + ": " + value));
}
static class Item {
private final String key;
private final String value;
public Item(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
}
}
在这个例子中,有两个 Item
对象具有相同的 key ("key1"
),我们通过提供一个合并函数 (value1, value2) -> value1 + ", " + value2
来合并具有相同 key 的值。合并函数将第一个值和第二个值连接为一个字符串,两个值之间用逗号和空格分隔。
输出结果将是:
key1: value1, value3
key2: value2
合并函数可以根据你的需求进行自定义。例如,你可以选择保留第一个值、第二个值,或者对两个值进行某种运算,如取最大值、求和等。
在使用 Collectors.toMap
时,请确保合并函数能够正确处理可能的重复 key,避免 IllegalStateException
的发生。