让我们假设我有一个对象:
class MyObject {
private int id;
private HashMap<Integer, OtherObject> otherObjects;
}
我想要做的是访问otherObjects
列表的MyObject
属性,并将其全部添加到otherObjects
list
。
我可以在.forEach
.addAll
中使用otherObjects
和list
,但我正在尝试查看是否可以使用lambdas来实现此目的。我想到了类似的东西,但它似乎不起作用:
myObjectList.stream()
.map(o -> o.getOtherObjects())
.map(oo -> oo.values())
.collect(Collectors.toList());
但似乎与对象类型存在冲突。我猜这是因为我从一个对象流开始,最后得到一个列表流,它会混淆。我怎样才能做到这一点?更一般地说,如何将许多父对象的对象列表收集到一个列表中?
答案 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());