我想在同一个流上使用连接收集器两次,以生成一个像Tea:5 - Coffee:3 - Money:10
这样的字符串。
饮料是带有Bigdecimal属性(价格)的枚举。
目前我这样做了:
Map<Drink, Long> groupByDrink = listOfDrinks.stream().collect(groupingBy(identity(),counting()));
String acc = groupByDrink.entrySet().stream().map(ite -> join(":", ite.getKey().code(), ite.getValue().toString())).collect(joining(" - "));
acc += " - Money:" + groupByDrink.entrySet().stream().map(ite -> ite.getKey().price().multiply(valueOf(ite.getValue()))).reduce(ZERO, BigDecimal::add);
答案 0 :(得分:3)
我认为,你过度使用了新功能。
join(":", ite.getKey().code(), ite.getValue().toString())
没有经典优势
ite.getKey().code()+":"+ite.getValue()
除此之外,我不确定你的意思是“在同一个流上使用加入收集器两次”。如果您还想使用摘要元素的连接收集器,则必须在收集之前将其连接为流:
String acc = Stream.concat(
groupByDrink.entrySet().stream()
.map(ite -> ite.getKey().code()+":"+ite.getValue()),
Stream.of("Money:" + groupByDrink.entrySet().stream()
.map(ite -> ite.getKey().price().multiply(valueOf(ite.getValue())))
.reduce(ZERO, BigDecimal::add).toString())
).collect(joining(" - "));