Java 如何从连续点列表创建截面列表
这个问题很容易用经典的for循环解决Java 如何从连续点列表创建截面列表,java,functional-programming,Java,Functional Programming,这个问题很容易用经典的for循环解决 for (i = 0; i < points.size() - 1; i++) { PointAG p1 = this.points.get(i); PointAG p2 = this.points.get(i + 1); sections.add(new LineSection(p1, p2)); } (i=0;i
for (i = 0; i < points.size() - 1; i++) {
PointAG p1 = this.points.get(i);
PointAG p2 = this.points.get(i + 1);
sections.add(new LineSection(p1, p2));
}
(i=0;i{
PointAG p1=此.points.get(i);
PointAG p2=this.points.get(i+1);
节。添加(新线节(p1、p2));
}
是否有可能以函数方式实现相同的功能,例如使用两个迭代器?取决于“函数方式”的含义
如果您的意思是“使用流”,那么以下可能是一种方法:
List<LineSection> sections = IntStream.range(1, points.size())
.mapToObj(i -> new LineSection(this.points.get(i - 1), this.points.get(i)))
.collect(Collectors.toList());
您可以使用单个迭代器执行此操作,因此:
Iterator<PointAG> it = points.iterator();
if (it.hasNext()) {
PointAG prev = it.next();
while (it.hasNext()) {
PointAG next = it.next();
sections.add(new LineSection(prev, next));
prev = next;
}
}
这利用了Java保证的从左到右的求值顺序,这意味着第一个prev
在重新分配之前进行求值。这可能不是最好的方法:在读取代码时,表达式内部的副作用很容易被忽略;使用你喜欢阅读的书
这样做-使用迭代器-将比索引非
随机访问
列表实现更有效,例如LinkedList
编译器显示错误。需要使用mapToObj而不是Map您甚至可以声明prev
inline:for(PointAG prev=it.next();it.hasNext();)
Iterator<PointAG> it = points.iterator();
if (it.hasNext()) {
PointAG prev = it.next();
while (it.hasNext()) {
PointAG next = it.next();
sections.add(new LineSection(prev, next));
prev = next;
}
}
while (it.hasNext()) {
sections.add(new LineSection(prev, prev = it.next()));
}