2016-07-17 124 views
1

我想在同一個流上使用兩次加入收集器來產生像這樣的字符串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); 

回答

3

我想,你是過度使用的新功能。

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

不承擔任何優勢古典

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

除此之外,我不知道你的意思「使用合併兩次收集在同一個流」什麼。如果你想使用的概要元素加入收藏家以及,你必須收集之前Concat的它流:

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

此代碼不會在相同的流水線做這兩種操作。它創建**兩個**流('groupByDrink.entrySet().stream()')併合並結果。 – Alexey

+1

@Alexey:我從來沒有聲稱過這一點,並且這個問題中沒有任何暗示這是希望的。所有這些解決方案都使用單一的「加入」收集器來處理所有結果,這似乎是,問題的關鍵。至少,它談到了'加入'收藏家...... – Holger

+0

也許我沒有看到OP想要做什麼。我認爲他/他很不高興,因爲一個流是從'groupByDrink'地圖中兩次播放的,並且他/她想要一次完成。 – Alexey