从单个流中收集更多列表,然后将它们全部合并

时间:2018-04-18 06:51:38

标签: java java-stream

是否有更优雅的方式从单个流中收集更多列表,然后将它们全部合并?

这就是我提出的:

</p>

在我看到这三行代码时,我觉得有代码重复,但是我没有找到一种方法来加入我正在使用流做的不同地图操作。

感谢您的帮助!

1 个答案:

答案 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()));