2015-01-08 15 views
12

私はJava 8の新機能を少し新しくしました。私はエントリでマップをフィルタリングする方法を学んでいます。私はthis tutorialthis postを見ましたが、解決できません。どちらも enter image description hereJava 8のLambda、フィルターHashMapはメソッドを解決できません

このヘルプを行います:

@Test 
public void testSomething() throws Exception { 
    HashMap<String, Integer> map = new HashMap<>(); 
    map.put("1", 1); 
    map.put("2", 2); 
    map = map.entrySet() 
      .parallelStream() 
      .filter(e -> e.getValue()>1) 
      .collect(Collectors.toMap(e->e.getKey(), e->e.getValue())); 
} 

しかし、私のIDE(IntelliJのは)complileすることができない、 "方法 'のgetKeyを()' を解決できません" と言うん enter image description here
誰も私を助けることができますこの問題を解決するには?おかげさまで

+0

私が求めることができる場合は...何であるか**電子**正確に...それはどこにでも... – Olu

+0

@tobias_k、問題ジェネリック医薬品に関するべきではないと宣言参照いけません。これはhttp://www.leveluplunch.com/java/examples/filter-map-by-value/ – Daniel

+1

に従って動作するはずです。@FlorentBayleはキャストを追加する(HashMap )役立ちます! – Daniel

答えて

27

メッセージは誤解を招くですが、あなたのコードは、別の理由でコンパイルされません:Map<String, Integer>ないHashMapを返しcollect

あなたは

Map<String, Integer> map = new HashMap<>(); 

を使用する場合は、予想通り、それは(も、あなたが関連するすべての輸入を持っていることを確認してください)動作するはずです。

+1

明らかに、エラーの本当の原因についてコンパイラーが十分にスマートになるには、ある程度の時間がかかります。現時点では非常に不満です... –

+0

.collectによって返される内容を(HashMap )でキャストダウンすると、動作するように見えます。しかし、鋳造に関する問題はありますか? – Daniel

+0

私は常に、インターフェイス、リスト、マップe.t.cからデータ構造を生成することを好みます。 – Olu

4

マップはハッシュマップではないため、mapタイプをjava.util.Mapに変更する必要があります。さらに、メソッド参照を使用して、getKey、getValueを呼び出すことはできません。例えば。

Map<String, Integer> map = new HashMap<>(); 
     map.put("1", 1); 
     map.put("2", 2); 
     map = map.entrySet() 
       .parallelStream() 
       .filter(e -> e.getValue() > 1) 
       .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

たとえば、次のようなintellijヘルプを使用して解決できます。あなたは

new HashMap<>(); 
      map.put("1", 1); 
      map.put("2", 2); 
      map = map.entrySet() 
        .parallelStream() 
        .filter(e -> e.getValue() > 1) 
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

の前でctrl+alt+vを押した場合のIntelliJで作成された変数は、正確な型のものであろうと、あなたが取得します。

Map<String, Integer> collect = map.entrySet() 
     .parallelStream() 
     .filter(e -> e.getValue() > 1) 
     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 
+0

ctrl + alt + vは素晴らしいです – Daniel

関連する問題