假设我有一组碰碰车,它们都有大小、颜色和一个标识符(“汽车代码”)在它们的侧面。
现在我需要将碰碰车映射到一个
例如,
应该的结果是:
我尝试了以下代码,它实际上实现了我的需求。但问题是它将中间结果(转换为
当然,如果这是可能的。
请注意,为了简洁起见,我省略了getter和constructor。您还可以假设
编辑:还要注意,当然可以使用传统的for循环,但这不在本问题的范围内。
class BumperCar {
int size;
String color;
String carCode;
}
现在我需要将碰碰车映射到一个
List
对象的 DistGroup
中,其中每个对象都包含 size
、color
属性和一个汽车代码的 List
。class DistGroup {
int size;
Color color;
List<String> carCodes;
void addCarCodes(List<String> carCodes) {
this.carCodes.addAll(carCodes);
}
}
例如,
[
BumperCar(size=3, color=yellow, carCode=Q4M),
BumperCar(size=3, color=yellow, carCode=T5A),
BumperCar(size=3, color=red, carCode=6NR)
]
应该的结果是:
[
DistGroup(size=3, color=yellow, carCodes=[ Q4M, T5A ]),
DistGroup(size=3, color=red, carCodes=[ 6NR ])
]
我尝试了以下代码,它实际上实现了我的需求。但问题是它将中间结果(转换为
Map
)具体化了,并且我认为可以一次性完成(可能使用mapping
、collectingAndThen
或reducing
等方法),从而产生更优雅的代码。List<BumperCar> bumperCars = …;
Map<SizeColorCombination, List<BumperCar>> map = bumperCars.stream()
.collect(groupingBy(t -> new SizeColorCombination(t.getSize(), t.getColor())));
List<DistGroup> distGroups = map.entrySet().stream()
.map(t -> {
DistGroup d = new DistGroup(t.getKey().getSize(), t.getKey().getColor());
d.addCarCodes(t.getValue().stream()
.map(BumperCar::getCarCode)
.collect(toList()));
return d;
})
.collect(toList());
如何在不使用中间结果变量的情况下获得所需结果?
编辑:如何在不实现中间结果的情况下获得所需结果?我只是在寻找一种不会实现中间结果的方法,至少不会表面上实现。这意味着我更喜欢不使用像这样的东西:
something.stream()
.collect(…) // Materializing
.stream()
.collect(…); // Materializing second time
当然,如果这是可能的。
请注意,为了简洁起见,我省略了getter和constructor。您还可以假设
equals
和hashCode
方法已经正确实现。同时,请注意我使用SizeColorCombination
作为分组键。这个类显然包含了size
和color
属性。也可以使用像Tuple
、Pair
、Entry
或任何表示两个任意值组合的类。编辑:还要注意,当然可以使用传统的for循环,但这不在本问题的范围内。
groupingBy()
默认将值分组为List
,因此可以省略toList()
。 - Lino