Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从连续点列表创建截面列表_Java_Functional Programming - Fatal编程技术网

Java 如何从连续点列表创建截面列表

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循环解决

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()));
  }