For loop 从流中的其他流返回值

For loop 从流中的其他流返回值,for-loop,java-8,java-stream,For Loop,Java 8,Java Stream,任务 我有一个对象列表“Point”和它的过滤版本:Step2中的allPoints和Points,其中Step2是另一个方法。我需要将从第二步得到的所有点添加到列表中,这些点与同时应用于第二步的所有点和点的条件相匹配 代码看起来像: public List<Point> stepThree(List<Point> pointsFromStepTwo, List<Point> allPoints) { return allPoints.stream()

任务

我有一个对象列表“Point”和它的过滤版本:Step2中的allPoints和Points,其中Step2是另一个方法。我需要将从第二步得到的所有点添加到列表中,这些点与同时应用于第二步的所有点和点的条件相匹配

代码看起来像:

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());
public列出第三步(列出第二步中的点,列出所有点){
返回allPoints.stream()
.filter(point->point.getRadius()+{points来自step2.stream().forEach(point1->point1.getRadius());>smth})
}.collect(Collectors.toList());
其中“smth”是一种特殊情况

问题

我找不到一种正确的方法每次都从Step2中的点返回值到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);
}
public列出第三步(列出第二步中的点,列出所有点){
Set tmp=new HashSet();
对于(点1:所有点){
对于(点2:步骤2的点){
如果(第1点)等于(第2点)||
point1.getRadius()+point2.getRadius()+getGap()+getErr()>=getL(point1,point2)){
tmp.add(第2点);
}
}
}
返回新的ArrayList(tmp);
}

其中getL(点1,点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());
}

如何显示java-8之前版本将用于此的for循环?尝试从Step2.forEach(point1->{allPoints.stream().filter(point1.getRadius()+point2.getRadius()>=getL(point1,point2)).forEach(tmp::add);}但我还没有测试它。没有局部变量,可以这样做吗?我假设您的答案中的tmp是一个局部变量列表tmp=newarraylist();可能像这样
allPoints.stream().map(point1->{pointsfromstep2.stream().filter(point2->point1+point2>=getL(point1,point2));return point1;}).collect(collector.toList())
@Alexander如果您指的是我的第二个代码段,我暗示它可能会更改StepTwo中属于
点的元素的顺序,因为它不会单独添加StepTwo
中的
点的元素(就像您对
addAll
所做的那样)。它在遍历
allPoints
列表的元素时添加它们。如果您关心顺序,则必须分别调用
addAll
。不同之处不在于顺序,而在于各自的点。我准备好了。我将for循环中的for循环的代码示例从列表更改为Set,然后答案变得相同。再次谢谢你。
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());
}