【发布时间】:2021-05-21 21:14:54
【问题描述】:
我有一个向量列表,我想使用流在它们之间画线(目标是一条穿过所有点的连续线)。 目前,我的设置如下所示:
l.points().stream()
.map(v -> vectorOfTile((int) v.x, (int) v.y))
.reduce(l.points().get(0), (v1, v2) -> {
line(v1.x, v1.y, v2.x, v2.y);
return v2;
});
不幸的是,这显然是对 reduce 方法的误用,因为我使用它来对每个项目进行两次迭代,对流中的每个邻居进行一次。
有没有办法在流中使用一些二元运算符来实现相同的行为?我该如何实现这样的 Operator?
正如@Piotr 所指出的,使用通用的 for 循环可能只是可行的方法。我现在解决问题的方法如下:
PVector[] a = l.points().stream().map(v -> vectorOfTile((int) v.x, (int) v.y)).toArray(PVector[]::new);
for (int i = 0; i < a.length - 1; i++) {
line(a[i].x, a[i].y, a[i + 1].x, a[i + 1].y);
}
【问题讨论】:
-
我认为您的问题假设流既是顺序的又是有序的(有些不是)。我猜API只支持适用于所有类型流的操作,所以可能没有API可以从流中获取“一对相邻项”,因为它对于并行或无序流没有很好的定义?也许你可以为此做一个普通的 for 循环?会不会容易些?
-
@Piotr 好点 - 我主要使用顺序流,所以这是我没有考虑过的。我认为您可能是对的,我最好的方法是常规的 for 循环。我现在刚刚将映射流变成了一个数组,它以良好的易读性做了同样的事情。谢谢!
-
从学校给我一个怀旧的回忆。是的,当使用同一集合中的多个元素序列时,使用常规 for 循环会更容易。试图使用流将奇数和偶数相加为同一流中的两个不同结果。流不能很好地访问多个元素的序列。
标签: java java-stream processing