2015-04-14 17 views
23

değerini edelim toplamak. Örnek için HashMap ben hem HashMap içine bazı değerleri sokulan bir hashmap</p> <pre><code>Map<Integer, List> id1 = new HashMap<Integer,List>(); </code></pre> <p>dikkate Harita

,

List<String> list1 = new ArrayList<String>(); 

    list1.add("r1"); 
    list1.add("r4"); 

    List<String> list2 = new ArrayList<String>(); 
    list2.add("r2"); 
    list2.add("r5"); 

    List<String> list3 = new ArrayList<String>(); 
    list3.add("r3"); 
    list3.add("r6"); 

    id1.put(1,list1); 
    id1.put(2,list2); 
    id1.put(3,list3); 
    id1.put(10,list2); 
    id1.put(15,list3); 

Q1) Şimdi HashMap tuş üzerinde bir filtre koşulu uygulamak ve ilgili değeri (Liste) almak istiyor.

Örn: İşte Benim sorgu = 1 anahtardır ve çıkış 'list1'

Ben

id1.entrySet().stream().filter(e -> e.getKey() == 1); 

yazdı olmalı Ama bu çıktısı olarak liste olarak nasıl alınacağını bilmiyorum akış işlemi.

S2) Yine, hashmap'ta anahtar üzerinde bir filtre koşulu uygulamak ve ilgili liste listesini almak istiyorum.

Örnek: Burada, Sorgu anahtar =% 1'dir (yani anahtar 1,10,15 olabilir) ve çıktı "liste1", "liste2", "liste3" (liste listesi) olmalıdır. Eğer en fazla (filtrenizde tarafından garanti edilmektedir) filtreyi geçen tek eleman almak için gidiyoruz eminseniz

+4

Yarı pişmiş Genel türler kullanmayın. Muhtemelen, haritanız "Harita Holger

cevap

40

, sen findFirst kullanabilirsiniz:

Optional<List> o = id1.entrySet() 
         .stream() 
         .filter(e -> e.getKey() == 1) 
         .map(Map.Entry::getValue) 
         .findFirst(); 

genel durumda, eğer filtresi Listelerinin bir listesi onları toplayabilir, birden Listeleri eşleşebilir:

List<List> list = id1.entrySet() 
        .stream() 
        .filter(.. some predicate...) 
        .map(Map.Entry::getValue) 
        .collect(Collectors.toList()); 
+1

yerine" Harita > yerine "olmalıdır. .map (Map.Entry :: getValue)';) – fge

+0

@fge. .. – Eran

15

ne yapmanız gereken dışarı Stream oluşturmak olduğunu Map 'ın .entrySet():

// Map<K, V> --> Set<Map.Entry<K, V>> --> Stream<Map.Entry<K, V>> 
map.entrySet().stream() 

Açık olanlardan, bu girişler üzerinde .filter() yapabilirsiniz.

// Stream<Map.Entry<K, V>> --> Stream<Map.Entry<K, V>> 
.filter(entry -> entry.getKey() == 1) 

Ve bu .map() değerleri elde etmek için: Örneğin Nihayet

// Stream<Map.Entry<K, V>> --> Stream<V> 
.map(Map.Entry::getValue) 

, bir List içine toplamak gerekir:

// Stream<V> --> List<V> 
.collect(Collectors.toList()) 

durumda yalnızca bir giriş varsa , bunun yerine kullanın (NOT: bu kod bir değer olduğunu varsayar; aksi halde .orElse() kullanın; daha fazla bilgi için javadoc of Optional'a bakın):

// Stream<V> --> Optional<V> --> V 
.findFirst().get() 
+0

@ user2336315 evet, bu kod, değerin var olduğunu varsayar; OP bu konuda çok net değil. Ahwell – fge

4

Q2'niz için, sorunuzun yanıtları zaten var. Q1'iniz için ve daha genel olarak anahtarın filtrelenmesinin benzersiz bir değer vermesi gerektiğini bildiğinizde, Akımların hiç kullanılmasına gerek yoktur.

Yalnızca get veya getOrDefault kullanın, i.E:

List<String> list1 = id1.getOrDefault(1, Collections.emptyList()); 
1

Sen flatMap ile bu

public Map<Boolean, List<Student>> getpartitionMap(List<Student> studentsList) { 

    List<Predicate<Student>> allPredicates = getAllPredicates(); 
    Predicate<Student> compositePredicate = allPredicates.stream() 
          .reduce(w -> true, Predicate::and) 
    Map<Boolean, List<Student>> studentsMap= studentsList 
       .stream() 
       .collect(Collectors.partitioningBy(compositePredicate)); 
    return studentsMap; 
} 

public List<Student> getValidStudentsList(Map<Boolean, List<Student>> studentsMap) throws Exception { 

    List<Student> validStudentsList = studentsMap.entrySet() 
      .stream() 
      .filter(p -> p.getKey() == Boolean.TRUE) 
      .flatMap(p -> p.getValue().stream()) 
      .collect(Collectors.toList()); 

    return validStudentsList; 
} 

public List<Student> getInValidStudentsList(Map<Boolean, List<Student>> studentsMap) throws Exception { 

    List<Student> invalidStudentsList = 
      partionedByPredicate.entrySet() 
      .stream() 
      .filter(p -> p.getKey() == Boolean.FALSE) 
      .flatMap(p -> p.getValue().stream()) 
      .collect(Collectors.toList()); 

    return invalidStudentsList; 

} 

gibi yapmak da olabilir sadece List<Student> yerine List<List<Student>> arasında alacak.

Teşekkürler

İlgili konular