java - 减少java中的自定义对象列表
问题描述
我有两个名为OrthogonalPoint
和的自定义类PolarPoint
。
public class OrthogonalPoint extends AbstractPoint<OrthogonalPoint> {
private double x;
private double y;
// constructor, getters, ...
}
public class PolarPoint extends AbstractPoint<PolarPoint> {
private double rho;
private double theta;
// constructor, getters, ...
}
两者都扩展了一个抽象类AbstractPoint
。
public abstract class AbstractPoint<PointType extends AbstractPoint<PointType>> {
public abstract double getX();
public abstract double getY();
public final double distance(PointType other) {
// calculate distance between current point and other point
}
}
接下来,我有一堂课Route
。
public class Route<T extends AbstractPoint<T>> {
private final List<T> points = new ArrayList<>();
public void appendPoint(T point) {
this.points.add(point);
}
public double routeDistance() {
// calculate total distance
}
}
路线是有序数量的点,其长度定义为序列中点的距离之和。因此,如果一条路线由三个点(p1、p2 和 p3)组成,则该路线的距离为p1.distance(p2) + p2.distance(p3)
。在routeDistance
函数中,我想计算这个距离。我尝试过类似的东西
public double routeDistance() {
return this.points.stream().reduce(0d, (point, point2) -> point.distance(point2));
}
但是 lambda 函数的主体部分带有红色下划线:
Bad return type in lambda expression: double cannot be converted to T
计算距离的正确方法是什么?我想使用reduce,但任何解决方案都值得赞赏。
解决方案
您的问题是您以错误的方式使用 reduce 。Reduce 不会从您的流中获取两个元素,而是当前累加器和当前元素,并将它们组合起来以获得新的累加器。这是一个很好的 reduce 教程:https ://www.baeldung.com/java-stream-reduce 这里最简单的方法是不使用流。由于您需要保持每两个点的顺序,只需使用 i 介于 0 和 n-1 之间的常规 for 循环来遍历所有子路由并求和长度。
推荐阅读
- electron - 电子隐藏工作窗口无法正常工作
- javascript - 在reactjs中给定特定条件获取数组的值
- regex - 正则表达式匹配大括号之间的特定字符串
- shell - 随机 Zsh 提示
- r - 来自地狱的约会时间。在R中分离日期和时间
- python - django 创建具有空外键的对象
- json - 如何将环境变量添加到 app.json 文件
- c - 如何在介子交叉文件中指定库及其包含
- django - 如何通过 Django EmailMessage 将存储在云中的图像作为附件发送
- ios - Swift:UICollectionView sizeForItemAt 永远不会被执行