You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:54:03