首页 > 解决方案 > 仅在满足特定条件时应用减少

问题描述

有没有办法让 Stream 的 reduce() 方法的“减少”是可选的?

我想遍历一个周期列表并加入重叠的周期,如果它们不重叠,则保持两个周期:

interface Period {
    boolean overlaps(Period other);
}


List<Period> periods = new ArrayList<>();

periods.stream().reduce(new BinaryOperator<Period>() {
    @Override
    public Period apply(Period period, Period period2) {
        if (period.overlaps(period2)){
            // join period and period2 into period.
        }else{
            "return both"
            // don't reduce and maintain period and period2 in the list.
        }
        return null;
    }
});

标签: javajava-8java-streamreduce

解决方案


尝试collapseStreamEx中提供

// Here I use Range type provided in Google Guava for test.
List<Range<Integer>> list = Arrays.asList(Range.openClosed(1, 3), Range.openClosed(2, 4), Range.closed(5, 5));

StreamEx.of(list)
    .collapse(Range::isConnected, Range::span)
    .forEach(System.out::println);
// (1..4]
// [5..5]

推荐阅读