考虑以下示例:我有一个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);

当然,“扩展”是不存在的。想法是将流中的每个单个对象转换为其他对象的列表,然后将该列表添加到结果流中。

是否有类似的方法,或者其他方法可以流利地执行?

最佳答案

看来您只是在寻找 Stream.flatMap ,例如

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

09-26 14:57