任务
我有一个对象“ 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)是特殊条件
答案 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());
}