我有一个点列表,这些点之间的距离是我想要做的就是创建线段,其中线段由起点和终点以及两点之间的距离组成。
使用简单的for循环,我可以执行以下操作:
public static void main(String[] args) {
List<String> points = Arrays.asList("A", "B", "C", "D");
List<Double> distances = Arrays.asList(1.5, 2.5, 3.5);
for(int x=0; x< distances.size(); x++) {
new Segment(points.get(x), points.get(x+1), distances.get(x));
}
}
static class Segment {
private String startPoint;
private String endPoint;
private double distance;
public Segment(String startPoint, String endPoint, double distance)
{
this.startPoint = startPoint;
this.endPoint = endPoint;
this.distance = distance;
}
}
但是,有一种不错的方法可以对流执行相同的操作,而又不会增加代码的复杂性?
答案 0 :(得分:3)
要对流进行处理,您最终会做同样的事情,即迭代索引值:
NullPointerException
与:
List<Segment> list = IntStream.range(0, distances.size())
.mapToObj(x -> new Segment(points.get(x), points.get(x+1), distances.get(x)))
.collect(Collectors.toList());
除非List<Segment> list = new ArrayList<>();
for (int x = 0; x < distances.size(); x++)
list.add(new Segment(points.get(x), points.get(x+1), distances.get(x)));
非常慢并且可以从并行处理中受益,否则您不会通过使用流获得任何好处,而实际上运行起来会更慢。
答案 1 :(得分:1)
您可以对信息流执行以下操作:
if (points.size() - distances.size() != 1) throw new IllegalArgumentException();
List<Segment> path = IntStream.range(0, distances.size())
.mapToObj(x -> new Segment(points.get(x), points.get(x + 1), distances.get(x)))
.collect(Collectors.toList());
它是增加清晰度还是使功能模糊?
答案 2 :(得分:-2)
如果未使用细分,则为:
_private.convertParams=function(params){
var params= [];
Object.keys(values).forEach(function(key) {
params.push({"id":key,"option":"Igual","value":params[key].id})
});
return params;
}
也许您想使用第三个库(除Segment外)提供的类似Tuple3的类。