java - 仅在满足特定条件时应用减少
问题描述
有没有办法让 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;
}
});
解决方案
尝试collapse
在StreamEx中提供
// 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]
推荐阅读
- apache-spark - Spark SQL 中具有等效精度的十进制类型
- java - 如何在 PL/SQL 存储过程中返回自定义集
- c# - 无法在 C# 中反序列化 XML - 无法识别的元素“添加”
- mysql - 为什么我们使用案例 0 和 1?
- java - 使用 httpurlconnection 设置 http 标头
- kentico - 创建自定义模块时托管转换的推荐方法是什么?
- xpages - Xpages dojo 对话框选择值
- firebase - 两个云函数在一小时内使用超过 10,000 次读取?
- ms-access - 为 AccessDB 编写 VBA 代码以将 lat/long 转换为 geod。北/东区 4501 VA SP 仅北
- c# - DateTime : 解析未知格式