简体   繁体   English

Java forEach 嵌套循环为 stream

[英]Java forEach nested loop as stream

Stream instead of nested forEach loops Stream 而不是嵌套的 forEach 循环

I'd like to use stream instead of nested forEach loop.我想使用 stream 而不是嵌套的 forEach 循环。 I tried to create stream as seen below but it doesn't work.我尝试创建 stream 如下所示,但它不起作用。 ForEach loops work fine. ForEach 循环工作正常。 List of CarWrapper objects should contain as many objects as each of Car objects has strings in its strings list. CarWrapper 对象列表应包含与每个 Car 对象在其字符串列表中的字符串一样多的对象。 Could you help?你能帮忙吗?

''' '''

class Main {
 public static void main(String[] args) {
  new doit();
 }
}

class doit{
 public doit(){
List<CarWrapper> wrappers;
List<Car> cars = new ArrayList<>();
cars.add(new Car());
cars.add(new Car());

  //  cars.forEach(car -> {
  //         car.getDriver().getStrings().forEach(string -> {
  //             wrappers.add(wrapper(car, string));
  //         });
  //     });

  wrappers = cars.stream()
  .map(car->{
     car.getDriver().getStrings().forEach(string->{
      wrapper(car, string);
    });
  })
  .collect(Collectors.toList());
}


 public CarWrapper wrapper(Car car, String s){
   return new CarWrapper.Builder().setBrand(car.getBrand()).setString(s).build();
  }
}


  class Car{
    private Driver driver;
    private String brand;

  public Car(){
     this.brand="bmw";
     this.driver = new Driver();
  }

   public Driver getDriver(){
     return driver;
   }

   public String getBrand(){
     return brand;
    }
   }

   class Driver{
   private List<String> strings;

   public Driver(){
     this.strings = Arrays.asList("qwe","zxc");
   }

    public List<String> getStrings(){
     return strings;
     }
    }

  class CarWrapper{ 
    private String brand;
    private String string;

    private CarWrapper(){
    }

  public static class Builder{
  private String brand;
  private String string;

  public Builder setBrand(String brand){
    this.brand=brand;
    return this;
  }
  public Builder setString(String string){
    this.string=string;
    return this;
  }
  public CarWrapper build(){
    CarWrapper carWrapper = new CarWrapper();
    carWrapper.brand = this.brand;
    carWrapper.string = this.string;
    return carWrapper;
  }
}
}

''' '''

Try this尝试这个

wrappers = cars.stream()
              .flatMap(car -> car.getDriver().getStrings().stream()
                      .map(string -> wrapper(car, string)))
              .collect(Collectors.toList());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM