假设我有一组碰碰车,它们的侧面有尺寸、颜色和标识符(“汽车代码”)。
class BumperCar {
int size;
String color;
String carCode;
}
现在我需要将碰碰车映射到一个List对象DistGroup,每个对象都包含属性和size汽车代码。colorList
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 ])
]
我尝试了以下方法,它实际上做了我想做的事情。但问题是它实现了中间结果(到 a 中Map),我也认为它可以立即完成(可能使用mappingorcollectingAndThen或reducingor ),从而产生更优雅的代码。
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 和构造函数。您还可以假设equals和hashCode方法已正确实现。另请注意,我使用的SizeColorCombination是我用作分组键的。这个类显然包含属性size和color。也可以使用诸如Tuple、之类的Pair类或表示两个任意值的组合的任何其他类。编辑:还请注意,当然可以使用 ol' skool for 循环,但这不在此问题的范围内。Entry
墨色风雨
萧十郎
大话西游666
相关分类