如何为嵌套循环编写java流
我如何在下面的场景中使用java流和嵌套循环如何为嵌套循环编写java流,java,java-stream,Java,Java Stream,我如何在下面的场景中使用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
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);
}
}
}
}
}
封装测试;
导入java.util.ArrayList;
导入java.util.List;
进口龙目吸气剂;
进口龙目织机;
@塞特
@吸气剂
班车{
丝状肉桂;
int-wheelNo;
车轮详情车轮详情;
汽车(内胎,内胎轮号){
this.carName=carName;
this.wheelNo=wheelNo;
}
}
@吸气剂
@塞特
类别详情{
int-wheelNo;
弦轮颜色;
整数大小;
车轮细节(内部车轮编号、字符串车轮颜色、内部尺寸){
this.wheelNo=wheelNo;
this.wheelColour=wheelColour;
这个。大小=大小;
}
}
公共类testMain{
公共静态void main(字符串[]args){
List cars=new ArrayList();
添加(新车(“CarOne”,1));
添加(新车(“CarTwo”,2));
List wheelDetailsList=new ArrayList();
WheelDetails列表。添加(新的WheelDetails(1,“黑色”,16));
车轮细节列表。添加(新车轮细节(2,“灰色”,17));
用于(汽车:汽车){
用于(WheelDetails WheelDetails:wheelDetailsList){
if(car.getWheelNo()==wheelDetails.getWheelNo()){
汽车.车轮设置细节(车轮细节);
}
}
}
}
}
无法在流中找到执行上述操作的选项,这将非常有帮助
已经走遍了其他地区,但找不到它。。。任何链接或解决方案都会有帮助……尝试以下方法:
cars.forEach(car -> wheelDetailsList.stream()
.filter(wheelDetails -> wheelDetails.wheelNo == car.wheelNo).forEach(car::setWheelDetails));
以下解决方案修改车辆列表中的元素:
cars.forEach(car->car.setWheelDetails(
wheelDetailsList.stream()
.filter(wd->car.getWheelNo()==wd.getWheelNo())
.findFirst()
.orElse(空)
));
另一个更快的解决方案基于临时映射
:
Map wheelMap=wheelDetails列表
.stream()
.collect(collector.toMap)(
WheelDetails::getWheelNo,//键
wd->wd,//值
(wd1,wd2)->wd1,//(可选)用于解决冲突的合并函数
LinkedHashMap::新建//保留插入顺序
));
cars.forEach(car->car.setWheelDetails(wheelMap.get(car.getWheelNo()));
上面我有两个列表cars和wheelDetails列表数组,其中包含值。。。因此,如果您想使用与插入顺序和设置null
details相关的流在汽车对象列表(Cars)中设置wheelDetails的值,可能的改进是Map wheelMapping=wheelDetailsList.stream().collect(Collectors.toMap(wheelDetails::getWheelNo,Function.identity()),(a,b)->b)//如果车轮编号是唯一的,则不需要)
然后用于(Car-Car:cars){if(wheelMapping.containsKey(Car.getWheelNo()){//如果现有的wheelDetails为'null'Car,则不需要。}setWheelDetails(wheelMapping.get(Car.getWheelNo());}