加入两次相同的流

时间:2016-07-17 11:26:11

标签: java-8 java-stream

我想在同一个流上使用连接收集器两次,以生成一个像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);

1 个答案:

答案 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(" - "));