2016-11-18 6 views
1

の数である、私はこのコードを変更しようとしていますforeach使用してマッピングするためにrepetead文字列のキーを追加:アイデア、あなたが見ることができるように値は、Java 8のforEachを学ぶために、私のプロセスで繰り返し

Integer counter; 
    for(String s : stringList) { 
     counter = myMap.get(s); 

     if(counter == null) { 
      myMap.put(s, 1); 
     } 
     else { 
      myMap.put(s, counter + 1); 
     } 
    } 

を文字列が存在しない場合は、キーとして追加され、値は1に設定されます。 キーが存在する場合、カウンタは最新の値と等しくなり、counter + 1で置き換えられます。

Iこれを試しました:

stringList.forEach(s-> myMap.putIfAbsent(s,1)); 

しかし、それは仕事の半分にすぎません。

私はcomputeIfAbsentやcomputeIfPresentのようなメソッドが存在することを知っていますが、キーの後には関数が必要ですが何がわかりません。それは最終的なものでなければならないので、カウンタに値を変更することはできません。 putIfPresentが存在しないようです...

forEachとラムダ式を使用してこれを行うことはできますか?

答えて

3

あなたは、地図上merge機能を使用することができます。これは、キー、値、およびキーが以前から存在していた場合に呼び出される関数を取ります。

あなたはこのようにそれを使用することができます:

stringList.forEach(s -> myMap.merge(s, 1, (oldValue, newValue) -> oldValue + 1)); 

キーを削除したい場合にも、ラムダからnullを返すことができます。ここ

完全なドキュメント:

https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#merge-K-V-java.util.function.BiFunction-

+0

うわー、それはまさに私が探していたものです。私はまだjavadocsの秘密の説明に慣れています。私はtought mergeを使って2つの2つのマップをマージしました。これは素晴らしい! – Nooblhu

2

元のコードをそのまま使用することができます。ただ、ラムダ内でカウンタの宣言を移動:

strings.forEach(s -> { 
     Integer counter = myMap.get(s); 

     if (counter == null) { 
      myMap.put(s, 1); 
     } 
     else { 
      myMap.put(s, counter + 1); 
     } 
    }); 
+0

いやはや! XDええ、それは本当ですが、私はもっとJava 8スタイルのものを期待していましたが、あなたの答えは実際に動作します。 – Nooblhu

関連する問題