Java8到流的嵌套循环

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

试图通过一个简单的示例了解Java8流语法。查看了关于此主题的其他类似问题,但找不到任何与我的示例相匹配且对我有效的解决方案。基本上,我尝试用两个嵌套循环重构以下代码段,以使用新的流API:

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());