如何在Java流中配对不规则列表

时间:2018-08-21 23:18:12

标签: java java-stream

我有一个点列表,这些点之间的距离是我想要做的就是创建线段,其中线段由起点和终点以及两点之间的距离组成。

使用简单的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;
    }
}

但是,有一种不错的方法可以对流执行相同的操作,而又不会增加代码的复杂性?

3 个答案:

答案 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的类。