如何按枚举类型合并Java8中的多个列表?
我有两个清单:
List<StatusSummary> listA //4 items because we have 4 enum types
List<StatusSummary> listB //4 items because we have 4 enum types
class StatusSummary {
private StatusEnum resourcesStatus; //4 statuses: TypeA, TypeB, TypeC, TypeD
private Integer count;
}
我想要一份清单,每个清单上有4个项目 resourcesStatus: TypeA, TypeB, TypeC, TypeD
元素之和 count
字段类型:
List<StatusSummary> listA+B with 4 objects:
(resourcesStatus: TypeA, count: 3), (resourcesStatus: TypeB, count:99), (resourcesStatus: typeC, count:322), (resourcesStatus: TypeD, count:2)
到目前为止,我实现了如下内容:
listA
.getResourcesStatus()
.forEach(la -> listB.getResourcesStatus().stream()
.filter(lb -> lb.getResourcesStatus() == la.getResourcesStatus())
.forEach(lb -> result.add(new StatusSummary()
.count(la.getCount() + lb.getCount())
.status(la.getStatus()))));
2条答案
按热度按时间smdncfj31#
你可以用
Collectors.toMap
. Map绘制者ResourcesStatus
合并两个StatusSummary
与count
相同的合并函数中的字段ResourcesStatus
然后你得到Map<StatusEnum, StatusSummary>
然后使用.values()
在ArrayList
.tuwxkamq2#
使用问题
forEach
据我所知,您当前的解决方案使用forEach
,您可以使用streamapi,因为它将是一个简单的for循环,具有其他特性。您违反了javastream的副作用原则,简单地说,流在通过管道执行操作时不应该修改另一个集合。我还没有测试你的代码,但是,这不是你应该处理流的方式。可能的解决方案之一
你可以用
Collectors.groupingBy
与Collectors.summingInt
得到Map<StatusEnum, Integer>
状态和计数的总和。然后,每个条目都可以转换为StatusSummary
并被列为List
:... 或使用
Collectors.collectingAndThen
(相当详细):