从Stream内部的其他Stream返回值

时间:2018-06-20 07:53:20

标签: for-loop java-8 java-stream

任务

我有一个对象“ Point”的列表及其过滤版本:allPoints和pointsFromStepTwo,其中stepTwo是另一个方法。我需要添加到列表中,这是我从stepTwo中获得的所有Point,都与同时添加到allPoints和pointsFromStepTwo的条件匹配。

代码看起来像这样:

public List<Point> stepThree(List<Point> pointsFromStepTwo, List<Point> allPoints) {
    return allPoints.stream()
            .filter(point -> point.getRadius() + {pointsFromStepTwo.stream().forEach(point1 -> point1.getRadius()); > smth })
}.collect(Collectors.toList());

其中“ smth”是特殊条件。

问题

我找不到每次都将正确的方法从pointsFromStepTwo返回到allPoint的方法。 基本上,它是for循环内的for循环。我认为这会起作用:

public List<Point> stepThree(List<Point> pointsFromStepTwo, List<Point> allPoints) {
    Set<Point> tmp = new HashSet<>();

    for (Point point1 : allPoints) {
        for (Point point2 : pointsFromStepTwo) {
            if (point1.equals(point2) ||
                    point1.getRadius() + point2.getRadius() + getGap() + getErr() >= getL(point1, point2)) {
                tmp.add(point2);
            }
        }
    }

    return new ArrayList<>(tmp);
}

其中getL(point1,point2)是特殊条件

1 个答案:

答案 0 :(得分:2)

使用anyMatch代替forEach

public List<Point> stepThree(List<Point> pointsFromStepTwo, List<Point> allPoints)
{
    return allPoints.stream()
                    .filter(point2 -> pointsFromStepTwo.stream()
                                                       .anyMatch(point1 -> point1.getRadius() + point2.getRadius() >= getL(point1, point2)))
                    .collect(Collectors.toList());
}

编辑:您似乎希望输出List包含pointsFromStepTwo的所有点。如果您不关心顺序,那么(假设pointsFromStepTwo的所有点都属于`allPoints),则可以向过滤器添加条件:

public List<Point> stepThree(List<Point> pointsFromStepTwo, List<Point> allPoints)
{
    return allPoints.stream()
                    .filter(point2 -> pointsFromStepTwo.stream()
                                                       .anyMatch(point1 -> point2.equals(point1) || (point1.getRadius() + point2.getRadius() >= getL(point1, point2))))
                    .collect(Collectors.toList());
}