java - 在 java 8 中对不同对象流执行平面映射时是否可以合并列表属性?

标签 java java-8

我有一个流操作,但它并没有完全按照我想要的方式进行

鉴于此数据结构

CatOwner {
    id, 
    name, 
    List <CatType>
}           

这段代码

    List<CatOwner> catOwner = owners.stream()
               .map(CatOwnerAccount:getCatOwnerAccountDetails)
               .filter(Objects::nonNull)
               .flatMap(catOwnerFunction)
               .distinct()
               .collect(Collectors.toList());

哪里

Function<CatOwnerAccountDetails, Stream<CatOwner>> catOwnerFunction = catOwnerDetails -> getCatOwners(catOwnerDetails);

我希望这能为我提供一个独特所有者的合并列表,将来自不同来源的所有猫组合在一起,因此与其生成此列表(因为它是平面映射,然后对具有不同列表的对象进行不同的操作),不如将其合并列表

所以不要生成这个

{ id : 1, name: Steve, cattype : [tabby, ginger] }
{ id : 1, name: Steve, cattype : [black] }
{ id : 2, name: Mandy, cattype : [tortashelle] }
{ id : 2, name: Mandy, cattype : [manx, grey] }

它会产生这个

{ id : 1, name: Steve, cattype : [tabby, ginger, black] }
{ id : 2, name: Mandy, cattype : [tortashelle, manx, grey]  }

有人可以帮忙吗?

最佳答案

您可以通过创建中间 map 来做到这一点,但它不是很漂亮。

Collection<CatOwner> values = owners.stream()
    // blah blah, the other stuff you had
    .collect(
        Collectors.toMap(
            owner -> new Pair<>(owner.getId(), owner.getName()),
            Function.identity(),
            (a, b) -> {
                a.getTypes().addAll(b.getTypes());
                return a;
            }
        )
    )
    .values();

我用了javafx.util.Pair作为关键,尽管任何将相等性实现为两个元素的组合相等性的元组类都可以。

owner -> new Pair<>(owner.getId(), owner.getName())

这表示 map 的值为 CatOwner项目本身(即,映射是 Pair<Id, Name>CatOwner )。

Function.identity()

这表示如果发生冲突(两个具有相同 ID 和名称的项目),解决该问题的方法是添加 CatOwner 中的所有类型。到另一个。

(a, b) -> {
    a.getTypes().addAll(b.getTypes());
    return a;
}

结果是 Collection ,因为您获取了 map 的所有值。如果您确实想要/需要一个列表,您可以将值添加到新列表中。

new ArrayList<>(values);

关于java - 在 java 8 中对不同对象流执行平面映射时是否可以合并列表属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60435254/

相关文章:

java - 是否有Java或任何api可以通过给定的字符串(例如Apple-> Fruit)检测产品类型(类别)?

java - 尽管保留了所有内容,但无法使用 log4j 生成日志文件

java - 如何在 Java 1.8 Streams 中仅当存在至少一个元素时才在 foreach 之前执行逻辑

java - 使用 lambda 时处理空指针

java - 使用 Spark 和 java 编写 CSV 文件 - 处理空值和引号

java - 将数据存储到二维数组

java - 如何在Android中显示绘制位图

java - 在 HashMap 中使用 ComputeIfAbsent

java - 使用 JavaFX 渲染窗口中的空像素

java - 为流中已有的每个元素添加一个元素到流的末尾