我有一张地图
HashMap<String, List<SomeObject>> map = data();
我需要遍历对象列表并将其映射到另一个对象,然后收集到另一个对象列表。下面是示例代码,我该如何以正确的方式做到这一点?
List<User> userList = new ArrayList<>();
map.forEach((key, value) ->
userList = value.stream()
.filter(obj-> testSomeCondition(obj))
.map(obj -> mapper.mapToUser(obj,key))
.collect(Collectors.toList())
);
答案 0 :(得分:2)
您可以使用以下方法实现
List<User> userList = map.entrySet()
.stream()
.flatMap(entry -> entry.getValue().stream()
.filter(object -> testSomeCondition(object))
.map(object -> mapper.mapToUser(object, entry.getKey()))
).collect(Collectors.toList());
flatmap
在这里返回一个流,该流基本上具有映射流的所有元素(由mapper函数生成,在这种情况下为entry.getValue().stream()
)
您可以了解有关here
答案 1 :(得分:1)
如果不关心性能(由于顺序forEachOrdered
引起的),并且可以使用副作用函数(在可变集合上添加),则可以这样做。 (IMO比嵌套流更具可读性)
List<User> result = new ArrayList<>();
map.forEach((key, value) -> {
value
.stream()
.filter(this::testSomeCondition)
.map(object -> mapper.mapToUser(object, key))
.forEachOrdered(result::add);
});
public boolean testSomeCondition(Object object) {return true;}