user3794642
user3794642

Reputation: 23

Joining twice the same stream

I would like use the joining collector twice on a same stream for produce a string like this Tea:5 - Coffee:3 - Money:10 .

Drink is enum with an Bigdecimal attribute (price).

currently I done like this :

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);

Upvotes: 1

Views: 182

Answers (1)

Holger
Holger

Reputation: 298539

I think, you are overusing new features.

join(":", ite.getKey().code(), ite.getValue().toString())

bears no advantage over the classical

ite.getKey().code()+":"+ite.getValue()

Besides that, I’m not sure what you mean with “use the joining collector twice on a same stream”. If you want to use the joining collector for the summary element as well, you have to concat it as stream before collecting:

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

Upvotes: 3

Related Questions