如何使用Java 8流获取路径长度

爱德华·格林钦科(Eduard Grinchenko)

我有List<Vector3D>Vector3D坐标在哪里我想查找Vector3D列表元素之间所有距离的总和我想使用Java 8流找到它。我尝试使用,reduce但不能帮助我。

UPD:

Vector3D有方法double distance(Vector3D)找到两个位置之间的距离。例如我有(1,0,0)(2,0,0)(3,0,0)的列表。结果,我想找到这条路径的长度。是3

如果我们使用的是Java 7或更低版​​本,则必须执行以下操作:

public static double calcPathLength(List<Vector3D> path){
    double length = 0d;
    for (int i=0; i< path.size()-1; i++){
        length += path.get(i).distance(path.get(i+1));
    }
    return length;
}
霍尔格

您正在执行的操作称为“可变约简”

Pshemo的答案显示了如何通过提供三个必要的功能来临时实现这种操作。但是,当所有三个功能都由专用类实现时,将这些功能实现在一个类中以实现Collector更方便的重用可能会很有用:

public class Distance implements Collector<Vector3D, Distance.Helper, Double> {

    public static final Distance COLLECTOR = new Distance();

    static final class Helper {
        private double sum = 0;
        private Vector3D first = null, previous = null;
    }
    public Set<Characteristics> characteristics() {
        return Collections.emptySet();
    }
    public Supplier<Helper> supplier() {
        return Helper::new;
    }
    public BiConsumer<Helper, Vector3D> accumulator() {
        return (helper,vector3d)-> {
            if (helper.previous != null)
                helper.sum += vector3d.distance(helper.previous);
            else helper.first = vector3d;
            helper.previous = vector3d;
        };
    }
    public BinaryOperator<Helper> combiner() {
        return (h1,h2)-> {
            h2.sum += h1.sum;
            if(h1.previous!=null && h2.first!=null) {
                h2.sum += h1.previous.distance(h2.first);
                h2.first=h1.first;
            }
            return h2;
        };
    }
    public Function<Helper, Double> finisher() {
        return helper -> helper.sum;
    }
}

您会从临时版本中识别出这三个功能。New是第四个函数,finisher它允许指定如何从可变容器中提取最终结果,因此我们不需要getSum()调用。

用例可简化为:

List<Vector3D> list;
//…
double distance=list.stream().collect(Distance.COLLECTOR);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Java 8流获取路径长度

来自分类Dev

如何在Java中获取路径的长度?

来自分类Dev

我如何使用Java 8流从哈希表获取值

来自分类Dev

如何使用Java 8流从哈希表获取值

来自分类Dev

如何使用Java 8流?

来自分类Dev

如何使用流编写它?Java 8

来自分类Dev

如何获取流长度或插入符在php中的位置?

来自分类Dev

如何获取流的长度或插入符在php中的位置?

来自分类Dev

使用Java8运行时如何在流中获取新的用户输入

来自分类Dev

Java 8流-如何过滤列表并获取值

来自分类Dev

Java 8流-如何过滤列表并获取值

来自分类Dev

Java的8流:获取非重复计数

来自分类Dev

获取财产的数组,属性(嵌套属性)的使用流的Java 8

来自分类Dev

如何通过给定的视图路径获取ClearCase流名称?

来自分类Dev

如何使用流Java获取列表中元素的大小

来自分类Dev

如何使用Java 8流返回Optional String

来自分类常见问题

如何使用Java 8流删除innermap键

来自分类Dev

如何使用Java 8流映射到多个元素?

来自分类Dev

如何使用流API在Java 8中对此进行映射?

来自分类Dev

Java 8,如何使用流实现switch语句?

来自分类Dev

如何使用Java 8流将列表中的值相乘

来自分类Dev

如何使用Java 8个流跨越多个列表?

来自分类Dev

如何使用Java 8查找两个流的交集?

来自分类Dev

如何使用Java从Eclipse获取当前项目路径

来自分类Dev

GroupingBy使用Java 8流

来自分类Dev

从Java 8流中获取下一项

来自分类Dev

Java 8流展开或发出列表以获取单个值

来自分类Dev

Java 8:如何在流中获取大于10的第一个数字?

来自分类Dev

如何在Java 8中以相反的顺序从列表中获取有序流

Related 相关文章

热门标签

归档