Java 8 Java8流:相同项目的单位总和

Java 8 Java8流:相同项目的单位总和,java-8,java-stream,Java 8,Java Stream,有没有一种简洁的方法可以用Java8流对列表中相同类型项的单位求和?例如,假设我有一个包含三项的列表: {id: 10, units: 1} {id: 20, units: 2} {id: 10, units: 1} 我喜欢这样的摘要流: {id: 10, units 2} {id: 20, units 2} 相同id项目的单位之和。有什么想法吗 下面是Federico的解决方案(使用Lombok): 假定​ 您有一个类MyClass,它封装了这两个字段并为它们提供了getter,您可以按

有没有一种简洁的方法可以用Java8流对列表中相同类型项的单位求和?例如,假设我有一个包含三项的列表:

{id: 10, units: 1}
{id: 20, units: 2}
{id: 10, units: 1}
我喜欢这样的摘要流:

{id: 10, units 2}
{id: 20, units 2}
相同id项目的单位之和。有什么想法吗


下面是Federico的解决方案(使用Lombok):


假定​ 您有一个类
MyClass
,它封装了这两个字段并为它们提供了getter,您可以按如下方式执行:

Map<Long, Integer> result = list.stream()
    .collect(Collectors.toMap(
        MyClass::getId,
        MyClass::getUnits,
        Integer::sum));
Map result=list.stream()
.collect(collector.toMap)(
MyClass::getId,
MyClass::getUnits,
整数::和);
我还假设
id
类型为
long
long
,而
units
类型为
int
Integer


创建一个映射,其键由其第一个参数确定,该参数是一个函数,用于将流的元素映射到映射的键。第二个参数是一个函数,它将流的一个元素映射到映射的值,第三个参数是一个运算符,它在键上发生冲突时合并两个值。

下面是另一个简单的解决方案


这不是另一个解决方案。这是相同的解决方案,增加了一个库,减少了5个字符。
java So44348207 
{id: 20, units: 2}
{id: 10, units: 2}
Map<Long, Integer> result = list.stream()
    .collect(Collectors.toMap(
        MyClass::getId,
        MyClass::getUnits,
        Integer::sum));
StreamEx.of(items).toMap(Item::getId, Item::getUnits, Integer::sum);