double
类型的Coordinate
属性x
和y
类,以及计算从该点到另一个给定点的距离的方法:
public record Coordinate(double x, double y) {
public double distanceTo(Coordinate point) {
// implementation
}
}
我想写一个方法furthestCoordinate
来确定给定流中距离点base
最远的点,如果流为空,则返回基本身。我写了一个Comparator
来比较Coordinate
对象和base
,但是当给定一个空流时,它抛出一个异常:
static Comparator<Coordinate> WayPointComparator = 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; // safes the base to be accessible for the Comparator
return coordinateStream.max(WayPointComparator).get();
}
如何使用累加器,每当流中的下一个Coordinate
更远时,累加器就会更新,如果流为空,则累加器本身返回'base'?
2条答案
按热度按时间42fyovps1#
您可以使用Java 8方法
Comparator.comparingDouble()
来定义基于Coordinate
类的方法distanceTo()
的比较器。如果给定流为空,则将
Optional.orElse()
应用于Stream.max()
操作返回的Optional
。k5ifujac2#
下面是一种方法:我使用JDK类
Math
和Point2D.Double
一些数据
定义的比较器。
还有小溪。
印刷品
collectors.maxBy返回一个
Optional<Point2D.Double>
。因此使用IfPresentOrElse可以处理答案或报告一个空流。如果你更喜欢使用自己的类和方法来计算点和距离,那么上面的方法仍然可以很好地工作。
下面是一个函数,用于获取特定
basePoint
的比较器。然后可以使用
stream
和basePoint
调用方法。basePoint
。但是任何点都可能是有效的答案。您可能只想返回optional
,然后使用ifPresent
或其他支持的方法来确定如何最好地处理空流。