Java 8 如何按枚举类型合并多个列表

标签 java list java-8 java-stream

如何通过枚举类型合并 Java 8 中的多个列表?

我有 2 个列表:

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()))));

最佳答案

您可以使用 Collectors.toMap . map ResourcesStatus并合并两个 StatusSummarycount相同的合并函数中的字段 ResourcesStatus然后你得到Map<StatusEnum, StatusSummary>然后使用 .values() 获取 map 的值在ArrayList .

List<StatusSummary> newList = 
           new ArrayList<>(
                  Stream.of(listA, listB)
                 .flatMap(Collection::stream)
                 .collect(Collectors.toMap(e -> e.getResourcesStatus(), i -> i,
                   (a,b) -> new StatusSummary(a.getResourcesStatus(),
                                                a.getCount() + b.getCount())))
                 .values());

关于Java 8 如何按枚举类型合并多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63505072/

相关文章:

python - 字符串文字中的反斜杠是什么意思?

python - 列表索引越界(街机游戏)

java - OutputStream 与 BufferedOutputStream

string - Lisp - 将输入拆分为单独的字符串

java - 使用 Collectors.groupingBy 创建复杂对象

java - 如何按集合的值流式传输 map ?

java - 为什么 Collectors.groupingBy 会与恒等函数混淆?

java - Java中如何求输入的最小序列数

java - 如何从数组中打印出 int 值?

java - 检查自定义 ListView 中的值是否已存在