使用lambdas

时间:2015-09-03 12:34:11

标签: java lambda java-8 java-stream

让我们假设我有一个对象:

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

我想要做的是访问otherObjects列表的MyObject属性,并将其全部添加到otherObjects list

我可以在.forEach .addAll中使用otherObjectslist,但我正在尝试查看是否可以使用lambdas来实现此目的。我想到了类似的东西,但它似乎不起作用:

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

但似乎与对象类型存在冲突。我猜这是因为我从一个对象流开始,最后得到一个列表流,它会混淆。我怎样才能做到这一点?更一般地说,如何将许多父对象的对象列表收集到一个列表中?

3 个答案:

答案 0 :(得分:5)

使用flatMap修复签名不匹配问题。也喜欢Haskell程序员的方法引用和胜利点:)

stringr

答案 1 :(得分:3)

您可以尝试使用flatMap:

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

答案 2 :(得分:1)

使用flatMap方法代替上次map来电。 flatmap方法将给定函数返回的流连接成一个流。像这样:

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