3 回答
![?](http://img1.sycdn.imooc.com/545862e700016daa02200220-100-100.jpg)
TA贡献1712条经验 获得超3个赞
不要在一个流中执行这两个操作。这是一种非常糟糕的风格。
先收集数据。然后变异元素。就像是:
Map<obj2, Optional<obj1>> map =
obj2Arr.stream()
.collect(toMap(identity(), o2 -> obj1Arr.stream()
.filter(o1 -> o1.getCarId().equals(o2.getCarId()))
.findAny()));
map.forEach((o1, optO2) -> optO2.ifPresent(o2 -> o1.setId(o2.id)));
否则,您可以只使用嵌套的 for-each 循环。
![?](http://img1.sycdn.imooc.com/545850c80001ebf202200220-100-100.jpg)
TA贡献1875条经验 获得超3个赞
我建议首先为第一个列表中的每个元素创建一个映射Map(我已经修改了你的类以使其更具可读性并删除了重复的 ID,我认为这是一个错误):carIdid
@Data @AllArgsConstructor
class Car {
Long id = null;
Long carId = null;
}
List<Car> obj1Arr = Arrays.asList(new Car(1L, 123L), new Car(2L, 1234L));
List<Car> obj2Arr = Arrays.asList(new Car(0L, 1234L), new Car(0L, 12345L));
Map<Long, Long> carIdToId = obj1Arr.stream()
.collect(Collectors.toMap(Car::getCarId, Car::getId));
// [Car(id=2, carId=1234), Car(id=0, carId=12345)]
然后,您可以使用它Map来过滤具有相同的汽车,carID而无需与其他汽车进行比较。然后,forEach只需在原始列表中设置 Id。
obj2Arr.stream()
.filter(anObjOf2 -> carIdToId.containsKey(anObjOf2.getCarId()))
.forEach(anObjOf2 -> anObjOf2.setId(carIdToId.get(anObjOf2.getCarId())));
System.out.println(obj2Arr);
// [Car(id=2, carId=1234), Car(id=0, carId=12345)]
如果您只想要相等的项目,您可以在然后carId设置ID 。不过,这仍会修改原始实例:peekcollect
obj2Arr = obj2Arr.stream()
.filter(anObjOf2 -> carIdToId.containsKey(anObjOf2.getCarId()))
.peek(anObjOf2 -> anObjOf2.setId(carIdToId.get(anObjOf2.getCarId())))
.collect(Collectors.toList());
System.out.println(obj2Arr);
// [Car(id=2, carId=1234)]
或者创建一个全新实例的列表:
obj2Arr = obj2Arr.stream()
.map(Car::getCarId)
.filter(carIdToId::containsKey)
.map(carId -> new Car(carIdToId.get(carId), carId))
.collect(Collectors.toList());
System.out.println(obj2Arr);
// [Car(id=2, carId=1234)]
![?](http://img1.sycdn.imooc.com/545863aa00014aa802200220-100-100.jpg)
TA贡献1848条经验 获得超6个赞
你可以在谓词中做到这一点anyMatch
List<obj2> newCarList= obj2Arr.stream()
.filter(anObjOf2 -> obj1Arr
.stream()
.anyMatch(carReg -> {
if(carReg.getCarId().equals(anObjOf2.getCarId()))) {
carReg.setId(anObjOf2.getId());
return true;
}
return false;
}).collect(Collectors.toList());
第二种方法
先过滤
List<obj2> newCarList= obj2Arr.stream()
.filter(anObjOf2 -> obj1Arr
.stream()
.anyMatch(carReg -> carReg.getCarId().equals(anObjOf2.getCarId())))
.collect(Collectors.toList());
现在设置id
newCarList.forEach(obj->{
obj1Arr.forEach(o-> {
if(o.getCarId().equals(obj.getCarId()) {
o.setId(obj.getId());
}
};
});
添加回答
举报