Collectors.toMap在JDK8的java.util.stream中是一个用于将流中的元素收集到一个Map中的方法。它的使用方式是通过提供一个键提取函数和一个值提取函数来生成一个Map对象。
在使用Collectors.toMap方法时,不允许使用相同的密钥是因为Map是一种键值对的数据结构,每个键必须是唯一的。如果使用相同的密钥,会导致后面的键值对覆盖前面的键值对,从而丢失数据。
为了解决这个问题,Collectors.toMap方法提供了一个重载的版本,允许我们通过提供一个合并函数来处理重复的键。合并函数接收两个重复键对应的值,并返回一个合并后的值。这样就可以在出现重复键的情况下,通过合并函数将对应的值合并起来,而不是直接覆盖。
下面是一个使用Collectors.toMap方法的示例:
List<Person> persons = Arrays.asList(
new Person("John", 20),
new Person("Jane", 25),
new Person("John", 30)
);
Map<String, Integer> ageMap = persons.stream()
.collect(Collectors.toMap(Person::getName, Person::getAge, (age1, age2) -> age1 + age2));
System.out.println(ageMap);
在上面的示例中,Person对象有一个name属性和一个age属性。我们通过流的方式将persons列表中的元素收集到一个Map中,键为name,值为age。由于存在两个name为"John"的元素,我们提供了一个合并函数,将对应的age值相加。最终输出的结果是一个包含三个键值对的Map:
{John=50, Jane=25}
推荐的腾讯云相关产品:腾讯云云服务器(CVM)、腾讯云云数据库MySQL(CDB for MySQL)、腾讯云云原生容器服务(TKE)。
腾讯云产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云