简体   繁体   English

如何为嵌套循环编写 java 流

[英]How to write java streams for the nested loops

How do I use the java streams for the below scenario with nested loops...如何在下面的嵌套循环场景中使用 java 流...

package test;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
class Car {
  String carName;
  int wheelNo;
  WheelDetails wheelDetails;

  Car(String carName, int wheelNo) {
    this.carName = carName;
    this.wheelNo = wheelNo;
  }
}

@Getter
@Setter
class WheelDetails {
  int wheelNo;
  String wheelColour;
  int Size;

  WheelDetails(int wheelNo, String wheelColour, int Size) {
    this.wheelNo = wheelNo;
    this.wheelColour = wheelColour;
    this.Size = Size;
  }
}

public class testMain {

  public static void main(String[] args) {

    List<Car> cars = new ArrayList<Car>();
    cars.add(new Car("CarOne", 1));
    cars.add(new Car("CarTwo", 2));

    List<WheelDetails> wheelDetailsList = new ArrayList<WheelDetails>();
    wheelDetailsList.add(new WheelDetails(1, "Black", 16));
    wheelDetailsList.add(new WheelDetails(2, "Grey", 17));
    for (Car car : cars) {
      for (WheelDetails wheelDetails : wheelDetailsList) {
        if (car.getWheelNo() == wheelDetails.getWheelNo()) {
          car.setWheelDetails(wheelDetails);
        }
      }
    }
  }
}

not able to find the options to do the above in the streams it will be great helpful无法在流中找到执行上述操作的选项,这将很有帮助

have gone trough the other areas but could not find it... any link or solution will be helpful......已经通过其他领域但找不到它......任何链接或解决方案都会有所帮助......

The following solution modifies elements in the list of cars:以下解决方案修改汽车列表中的元素:

cars.forEach(car -> car.setWheelDetails(
    wheelDetailsList.stream()
                    .filter(wd -> car.getWheelNo() == wd.getWheelNo())
                    .findFirst()
                    .orElse(null)
));

Another faster solution is based on a temporary map <Integer, WheelDetails> :另一个更快的解决方案是基于临时 map <Integer, WheelDetails>

Map<Integer, WheelDetails> wheelMap = wheelDetailsList
        .stream()
        .collect(Collectors.toMap(
            WheelDetails::getWheelNo, // key
            wd -> wd,                 // value
            (wd1, wd2) -> wd1,        // (optional) merge function to resolve conflicts
            LinkedHashMap::new        // keep insertion order
        ));
cars.forEach(car -> car.setWheelDetails(wheelMap.get(car.getWheelNo())));

Try this:尝试这个:

cars.forEach(car -> wheelDetailsList.stream()
    .filter(wheelDetails -> wheelDetails.wheelNo == car.wheelNo).forEach(car::setWheelDetails));

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

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