有没有一种方法可以使用Stream API将对象列表“展开”为更大的列表?

10

考虑这个例子:我有一个RangeSet列表,其中包含时间戳。我想使用Java8流而不是命令式方式来获取范围的总持续时间:

// "list" is List<RangeSet<Long>>

long totalTime = list.stream()
    .expand(rangeset -> rangeset.asRanges())
    .map(range -> range.upperEndpoint() - range.lowerEndpoint())
    .reduce(0, (total, time) -> total + time);

"expand"这个方法并不存在;它的想法是将流中的每个单独对象转换为其他对象的列表,并将该列表添加到生成的流中。

有没有类似的方法或者其他更流畅的实现方式?


2
list.stream().flatMap(rangeset -> rangeset.asRanges().stream()).mapToInt(range -> range.upperEndpoint() - range.lowerEndpoint()).sum() - Holger
1个回答

19

看起来你只是在寻找 Stream.flatMap,例如。

long totalTime = list.stream()
    .flatMap(rangeset -> rangeset.asRanges().stream())
    .map(range -> range.upperEndpoint() - range.lowerEndpoint())
    .reduce(0, (total, time) -> total + time);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接