java - 使用 lambda 获取对象列表的 hashmap 值

标签 java lambda java-8 java-stream

假设我有一个对象:

class MyObject {
    private int id;
    private HashMap<Integer, OtherObject> otherObjects;
}

我想要做的是访问 MyObject 列表的 otherObjects 属性,并将它们全部添加到 otherObjects 列表中.

我可以在 otherObjects list 中使用 .forEach.addAll 但我正在尝试查看是否可以使用 lambda 来实现这一点。我想到了这样的事情,但似乎不起作用:

myObjectList.stream()
    .map(o -> o.getOtherObjects())
    .map(oo -> oo.values())
    .collect(Collectors.toList());

但是对象类型似乎有冲突。我猜这是因为我从一个对象流开始,最后得到一个列表流,它变得很困惑。我怎样才能实现这个目标?更一般地说,如何将许多父对象的对象列表收集到单个列表中?

最佳答案

使用 flatMap 修复签名不匹配问题。也更喜欢方法引用并赢得 Haskell 程序员的分数:)

myObjectList.stream()
            .map(MyObject::getOtherObjects)
            .map(Map::values)
            .flatMap(Collection::stream)
            .collect(Collectors.toList());

关于java - 使用 lambda 获取对象列表的 hashmap 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32375771/

相关文章:

javascript - 如何在 Nashorn 中追踪 ReferenceError

Java 获取字节()

java - XA/JTA 事务 : JMS message arrives before DB changes are visible

java - 使用反射为泛型类型变量生成 lambda 类

java - Java 流阶段是顺序的吗?

c++ - std::function 与使用 auto 一样高效吗?

java - Java 8 是否提供了访问者模式的替代方案?

java - 使用 java 流将数组拆分为子数组 - 有状态映射器

java - 如何在 Exo-player v2.x 中添加 Adaptive Track Selector?

java - Play2 (java?) - 如何在不使用 session 或 flash 的情况下在拦截器中增强请求