2017-04-18 10 views
0

特定の決定に基づいて鉱山のリストを分割したいと思います。私はまた、これらの決定を保存する地図を持っています。 現在、ストリーム自体の決定を更新しています。グループ化の基準を把握する以外に、私が収集して の操作を行うのは、これが良い習慣ではないと感じます。私が持っているもう1つの方法は、ストリームをもう一度流れて し、forEachを使って地図を更新することですが、それはgetFinalDecisionを2回使用していることを意味します。より良いアプローチがありますか?方法はありますか? forEachでgetFinalDecisionを実行し、それをgroupingByに渡すことはできますか?あなたはあなたのコードを簡素化するためにMap#computeを使用することができますforEachで操作を実行し、JavaストリームでgroupingByに渡す方法

val test = myList.stream().collect(groupingBy(t -> { 
     A a = my_map.get(t.getSomething()); 
     A finalDecision = getFinalDecision(t.getSomeOtherThing(), a); 
     my_map.put(t.getSomething(), finalDecision); 
     return finalDecision; 
})); 
+2

あなたは実際の目標を具体化できますか? 'getFinalDecision'は' getSomething() 'によって返された実際の値を見ず、' getSomeOtherThing() 'とそれ以前の評価の結果だけを見ることはできません。そして、あなたの 'groupingBy'が' getFinalDecision'の結果を使用するときに、あなたはそれを2つの異なる操作にどのように分割したいですか? – Holger

答えて

3

私はわからないんだけど、それはあなたが実際にやりたいことはgetSomeOtherThing() RESPの戻り値の型がXgetSomething()Yの戻り値の型である以上のような

Map<X,Y> result = myList.stream() 
    .collect(groupingBy(t -> t.getSomething(), 
     reducing(null, t -> t.getSomeOtherThing(), (a,b) -> getFinalDecision(b,a)))); 

されているように見えます。 getFinalDecision(…)。もちろん、XYが同じタイプの場合にも機能します。

これは元のコードの最初の空のマップの動作を模倣し、結果としてnullが第2引数としてgetFinalDecisionに渡され、すべての別個のキーが最初に出現します。次に、2番目の引数は、そのキーに対する前のgetFinalDecisionの評価の結果になります。

古いコードの動作のみが妥協であった可能性がありますので、その代替方法についてお話します。あなたは

Map<X,Y> result = myList.stream() 
    .collect(groupingBy(t -> t.getSomething(), mapping(t -> t.getSomeOtherThing(), 
     collectingAndThen(reducing((a,b) -> getFinalDecision(a,b)), Optional::get)))); 

を使用すると値が最初にすべての個別のキーとgetFinalDecisionするための第1のgetSomeOtherThing()呼び出しの結果になりますキーの複数のオカレンスがある場合にのみ呼び出されます。したがって、getFinalDecision自体が以前の評価でnullを返さない限り、2番目の引数はnullになりません。

0

& & をグループ化するマージ:

test = myList.stream().collect(groupingBy(t -> my_map.compute(t.getSomething() 
      ,(it, a) -> getFinalDecision(t.getSomeOtherThing(), a)))); 

ORが、それは2つのことを行い記述するためにStream#peek & Stream#collectを使用。

test = myList.stream() 
    .map(it -> new SimpleEntry<>(it, getFinalDecision(it.getSomeOtherThing() 
              , my_map.get(it.getSomething())))) 
    .peek(it-> my_map.put(it.getKey(),it.getValue())) 
    .collect(groupingBy(SimpleEntry::getValue 
         ,mapping(SimpleEntry::getKey, toList()))); 
関連する問題