如何在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
相关产品推荐
相关产品推荐

