使用Java Stream API判断集合相邻对象属性差值是否超过指定阈值
类定义
public class MyObject { private int a; private int b; public MyObject(int a, int b) { this.a = a; this.b = b; } public int getA() { return a; } public int getB() { return b; } }
需求与错误实现
需要通过Stream API判断集合中相邻的两个MyObject对象,前一个对象的b属性值与后一个对象的a属性值的差值是否大于指定阈值(例如200)。
最初尝试用reduce方法实现,但reduce要求返回MyObject类型结果,而实际需要布尔类型的判断结果,以下是错误写法:
var list = Arrays.asList( new MyObject(100, 200), new MyObject(300, 400), new MyObject(700, 800) ); var result = list.stream().reduce((a, b) -> b.getA() - a.getB() > 200 ? true : false); // <-- !错误!
最优实现方案
通过自定义Collector实现,代码如下:
public class MyCollector { private int count = 0; private static long refValue = 200; private MyObject right; public void accept(MyObject newValue) { var left = right; right = newValue; if (left == null) return; var diff = right.getA() - left.getB(); if (diff > refValue) count++; } public MyCollector combine(MyCollector other) { throw new UnsupportedOperationException("不支持并行流"); } public int finish() { return count; } public static Collector<MyObject, ?, Integer> collector(long v) { refValue = v; return Collector.of(MyCollector::new, MyCollector::accept, MyCollector::combine, MyCollector::finish); } }
使用方式如下:
// 返回true,因为存在符合条件的差值:700 - 400 = 300 > 200 var result = list.stream().collect(MyCollector.collector(200)) != 0;
内容的提问来源于stack exchange,提问作者meridbt
相关产品推荐
相关产品推荐

