繁体   English   中英

减少 java 中的自定义对象列表

[英]Reduce a list of custom objects in java

我有两个自定义类,称为OrthogonalPointPolarPoint

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, ...
}

两者都扩展了一个抽象 class 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
    }
}

接下来,我有一个 class 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 function中,我想计算这个距离。 我试过类似的东西

public double routeDistance() {
    return this.points.stream().reduce(0d, (point, point2) -> point.distance(point2));
}

但是 lambda function 的正文部分带有红色下划线:

Bad return type in lambda expression: double cannot be converted to T

计算距离的正确方法是什么? 我想使用 reduce,但任何解决方案都值得赞赏。

您的问题是您以错误的方式使用 reduce 。 Reduce 不会从您的 stream 中获取两个元素,而是当前累加器和当前元素并将它们组合起来以获得新的累加器。 这里有一个关于 reduce 的好教程: https://www.baeldung.com/java-stream-reduce这里最简单的方法是不使用 stream。因为你需要保持每两个点的顺序,只需使用正则用 0 和 n-1 之间的 i 循环遍历所有子路由并对长度求和。

您不能将Point减少为Double 如果你需要使用ArrayList那么你可以mapToDouble然后sum() (减少的特例):

points.stream().skip(1).mapToDouble(point ->
        points.get(points.indexOf(point) - 1).distance(point)).sum();

或者

points.stream().limit(points.size() - 1).mapToDouble(point ->
        point.distance(points.get(points.indexOf(point) + 1))).sum();

使用ÌntStream ,您可以:

IntStream.range(1, points.size()).mapToDouble(i ->
        points.get(i - 1).distance(points.get(i))).sum();

或者

IntStream.range(0, points.size() - 1).mapToDouble(i ->
        points.get(i).distance(points.get(i + 1))).sum();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM