2016-03-15 25 views
5

Próbuję filtrować ConcurrentHashMap<String, LinkedList<String>> według rozmiaru LinkedList<String>.Filtr ConcurrentHashMap według wartości

Innymi słowy, chcę odfiltrować elementy w ConcurrentHashMap, gdzie rozmiar LinkedList<String> jest większy niż 4. Jak mogę to zrobić przez Java 8?

+0

Co masz na myśli przez „filtr”? jakie są twoje kryteria filtrowania? proszę dodaj więcej informacji –

Odpowiedz

11

Jeśli masz ConcurrentMap, można po prostu stworzyć strumień swoich wpisów, wywołując entrySet() i następnie stream() i utrzymać pozycje, w których wartość ma długość większą niż 4 przy zastosowaniu filter. Na koniec można go ponownie zebrać w postaci ConcurrentMap z wbudowanym Collectors.toConcurrentMap.

ConcurrentMap<String, LinkedList<String>> map = new ConcurrentHashMap<>(); 

ConcurrentMap<String, LinkedList<String>> result = 
    map.entrySet() 
     .stream() 
     .filter(e -> e.getValue().size() > 4) 
     .collect(Collectors.toConcurrentMap(Map.Entry::getKey, Map.Entry::getValue)); 

Alternatywnie, można to zrobić w miejscu, modyfikując mapę z

map.values().removeIf(l -> l.size() <= 4); 
+0

Dzięki za banda, to działa. Jedna drobna korekta - 'Map > map = new ConcurrentHashMap <>();' w przeciwnym razie kompilator mówi, że 'getKey' i' getValue' nie mogą zostać rozstrzygnięte –