Java8到流的嵌套循环
试图通过一个简单的示例了解Java8流语法。查看了关于此主题的其他类似问题,但找不到任何与我的示例相匹配且对我有效的解决方案。基本上,我尝试用两个嵌套循环重构以下代码段,以使用新的流API:Java8到流的嵌套循环,java,java-8,java-stream,Java,Java 8,Java Stream,试图通过一个简单的示例了解Java8流语法。查看了关于此主题的其他类似问题,但找不到任何与我的示例相匹配且对我有效的解决方案。基本上,我尝试用两个嵌套循环重构以下代码段,以使用新的流API: List<Car> filteredCars = new ArrayList<>(); for (Car car : cars) { for (Wheel wheel : wheels) { if (car.getColor() == wheel.getCo
List<Car> filteredCars = new ArrayList<>();
for (Car car : cars) {
for (Wheel wheel : wheels) {
if (car.getColor() == wheel.getColor() &&
wheel.isWorking() == true ) {
filteredCars.add(car);
break;
}
}
}
return filteredCars;
上面的流语法有什么问题,我缺少什么?您不能在同一个
流上执行两个终端操作-forEach
和collect
相反,您需要通过检查每辆车是否有匹配的工作轮来过滤车辆列表:
List<Car> filteredCars =
cars.stream()
.filter (
car -> wheels.stream()
.anyMatch(wheel -> wheel.getColor() == car.getColor() &&
wheel.isWorking()))
.collect(Collectors.toList());
List filteredCars=
汽车流
.过滤器(
car->wheels.stream()
.anyMatch(wheel->wheel.getColor()==car.getColor()&&
wheel.isWorking()))
.collect(Collectors.toList());
问题是,您正在forEach
中创建列表,并且forEach
返回void
。这相当于以下for循环:
for (Car car : cars) {
List<Car> filteredCars = new ArrayList<>();
for (Wheel wheel : wheels) {
if (car.getColor() == wheel.getColor() &&
wheel.isWorking() == true ) {
filteredCars.add(car);
break;
}
}
}
return filteredCars; // whoops cannot be accessed (scope) !!!
作为一般建议,停止先查看forEach
的行为。一旦您理解了这一点,并且总是首先查看其他流操作,您可能就再也不用问这样的问题了。除此之外,不要使用诸如wheel.isWorking()==true等条件,它们是毫无意义的。只要使用wheel.isWorking()
,它就说明了一切。
for (Car car : cars) {
List<Car> filteredCars = new ArrayList<>();
for (Wheel wheel : wheels) {
if (car.getColor() == wheel.getColor() &&
wheel.isWorking() == true ) {
filteredCars.add(car);
break;
}
}
}
return filteredCars; // whoops cannot be accessed (scope) !!!
Predicate<Car> carCheck = car -> wheels.stream().anyMatch(wheel -> car.getColor() == wheel.getColor() && wheel.isWorking());
List<Car> filteredCars = cars.stream().filter(carCheck).collect(Collectors.toList());