2015-01-08 31 views
12

Java 8'in yeni özelliklerinden birkaçıyım. Bir haritayı girişlere göre filtrelemeyi öğreniyorum. Sorunum için this tutorial ve this post'a baktım, ancak çözemiyorum. Java 8 Lambda, filtre HashMap, yöntemi çözemiyor

@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())); 
} 

Ancak, benim IDE (IntelliJ) oluşturdular.Çin'den böylece yapamaz, " 'Getkey()' yöntemini çözülemiyor" diyor: enter image description here

Ne bu yardımı yapar: enter image description here
Herkes bana yardımcı olabilir Bu sorunu çözmek için? Teşekkürler.

+0

sorabilirsem eğer .. ne ** e ** tam olarak .. her yerde .. – Olu

+0

@tobias_k bir sorun jenerik ilgili olmamalı ilan görmüyorum. Bu http://www.leveluplunch.com/java/examples/filter-map-by-value/ – Daniel

+1

@FlorentBayle'ye göre çalışmalı, casting (HashMap ) yardımcı olur! – Daniel

cevap

27

mesajı yanıltıcı ancak kod başka bir nedenle derleme değil: collect bir Map<String, Integer> değil HashMap döndürür.

Eğer beklendiği gibi

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

çalışması gerekir kullanırsanız (aynı zamanda ilgili tüm ithalat olduğundan emin olun).

+1

Görünüşe göre, derleyicinin bir hatanın gerçek nedeni hakkında yeterince akıllı olması için * biraz zaman alacaktır. Şu anda oldukça sinir bozucu ... –

+0

(HashMap ) tarafından .collect tarafından döndürülenleri düşürürsek, işe yarayacak gibi görünüyor. Ama dökümle ilgili bir sorun var mı? – Daniel

+0

I için her zaman arayüzlerden veri yapıları oluşturmayı tercih ediyorum, Liste, Harita e.t.c. – Olu

4

Geri dönenleriniz Mapiniz hashMap değil, map türünü java.util.Map olarak değiştirmeniz gerekiyor. Ayrıca, getKey, getValue çağırmak yerine yöntem başvurusunu kullanabilirsiniz. Örneğin.

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)); 

Bazı intellij yardımlarını da kullanarak, örn. Eğer

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)); 

önünde ctrl+alt+v basarsanız intellij yarattığı değişken kesin tipte olacak ve alacak.

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 harika – Daniel