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

如何在Java Streams中使用带默认值的累加器获取最远坐标?

实现Stream中距离基准点最远的坐标(空流返回基准点)

我使用2D坐标类(Coordinate),想要编写一个名为furthestCoordinate的方法,找出给定Stream<Coordinate>中距离基准点base最远的坐标;若Stream为空,则返回base本身。

现有代码通过自定义Comparator配合Stream.max()实现,但空流时调用get()会抛出异常,代码如下:

static Comparator<Coordinate> Comp = new Comparator<>() {
    @Override
    public int compare(Coordinate o1, Coordinate o2) {
        return Double.compare(o1.distanceTo(basePoint),o2.distanceTo(basePoint));
    }
};

public static Coordinate furthestCoordinate(Stream<Coordinate> coordinateStream, Coordinate base) {
    basePoint = base; // 保存基准点供Comparator访问

    return coordinateStream.max(Comp).get();
}

用累加器(reduce)实现的方案

可以利用Stream的reduce方法实现累加逻辑,直接处理空流场景,同时避免共享变量的线程安全问题:

public static Coordinate furthestCoordinate(Stream<Coordinate> coordinateStream, Coordinate base) {
    return coordinateStream.reduce(base, (currentFurthest, nextCoord) -> {
        double currentDist = currentFurthest.distanceTo(base);
        double nextDist = nextCoord.distanceTo(base);
        // 保留距离基准点更远的坐标
        return nextDist > currentDist ? nextCoord : currentFurthest;
    });
}

代码说明

  • reduce的第一个参数是初始值:当Stream为空时,直接返回这个初始值base,完美符合需求
  • 累加器Lambda的逻辑:每次对比当前记录的最远坐标和下一个坐标与基准点的距离,返回更远的那个
  • 不需要静态Comparator,避免了原代码中静态变量basePoint带来的多线程安全隐患

内容的提问来源于stack exchange,提问作者HeapUnderStop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:20:16