For loop 从流中的其他流返回值
任务 我有一个对象列表“Point”和它的过滤版本:Step2中的allPoints和Points,其中Step2是另一个方法。我需要将从第二步得到的所有点添加到列表中,这些点与同时应用于第二步的所有点和点的条件相匹配 代码看起来像: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()
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());
}