是否有更优雅的方式从单个流中收集更多列表,然后将它们全部合并?
这就是我提出的:
</p>
在我看到这三行代码时,我觉得有代码重复,但是我没有找到一种方法来加入我正在使用流做的不同地图操作。
感谢您的帮助!
答案 0 :(得分:4)
使用flatMap
!!
fetchedElements.stream()
.flatMap(item -> Stream.of(item.getBlueId(), item.getRedId(), item.getGreenId()))
.collect(Collectors.toSet());
请注意,评估顺序BRGBRG
而不是BBRRGG
,输出顺序当然是未定义的,因为您使用的是Set
。我认为这并不重要。
你可以使这种方法更通用:
private Set<Long> getAllIds(List<MyClass> fetchedElements,
List<Function<MyClass, Long>> extractors) {
return fetchedElements.stream()
.flatMap(item -> extractors.stream().map(f -> f.apply(item)))
.collect(Collectors.toSet());
}
致电:
Set<Long> myIds = getAllIds(fetchedElements, List.of(MyClass::getBlueId, MyClass::getRedId, MyClass::getGreenId))
如果您需要其他评估订单,请交换操作顺序:
extractors.stream()
.flatMap(f -> fetchedElements.stream().map(item -> f.apply(item))
.collect(Collectors.toSet()));