2016-07-17 9 views
1

同じストリームで結合コレクタを2回使用して、Tea:5 - Coffee:3 - Money:10のような文字列を生成したいと思います。同じストリームを2回結合する

飲み物は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); 

答えて

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

このコードでは、両方の操作を同じパイプラインで行うわけではありません。 ** 2つの**ストリーム( 'groupByDrink.entrySet()。stream()')を作成し、その結果を結合します。 – Alexey

+1

@Alexey:私はそれを主張したことは一度もなく、これが望んでいることを示唆する質問には何もありません。このソリューションはすべて、すべての結果に対して単一の「参加」コレクターを使用しています。これは、その質問の内容です。少なくとも、「参加する」コレクターについて話しています... – Holger

+0

多分、私はOPが何を望んでいるのかと思っていませんでした。私はストリームが 'groupByDrink'マップから2回cteatedされていることに不満があると思っていました。そして、彼は一度にそれをやりたいと思っていました。 – Alexey

関連する問題