2016-10-28 9 views
6

Jak mogę używać Kolektory zebrać w instread ConcurrentHashMap umieszczać ręcznie na ConcurrentHashMapJak mogę używać Kolektory zamiast ręcznego wprowadzania do ConcurrentHashMap w Java 8

ConcurrentHashMap<String, String> configurationMap = new ConcurrentHashMap<>(); 
List<Result> results = result.getResults(); 
results.stream().forEach(res -> { 
    res.getSeries().stream().forEach(series -> { 
     series.getValues().stream().forEach(vals ->{ 
       configurationMap.put(vals.get(1).toString(),vals.get(2).toString()); 
     }); 
    }); 
}); 

//Note: vals is List<List<Object>> type 

pomoc będzie mile widziane.

+2

Użyj jednej z przeciążeniami w strumieniu api https://docs.oracle.com/javase/8 /docs/api/java/util/stream/Collectors.html#toConcurrentMap-java.util.function.Function-java.util.function.Function- – kjsebastian

+2

Pomyśl dokładnie, czy to naprawdę musi być "ConcurrentHashMap". Wygląda na to, że ta mapa jest tworzona raz i tylko czytana później. W takim przypadku nie ma potrzeby używania "ConcurrentHashMap"; zwykła "mapa" też by się udało. – Holger

Odpowiedz

2

Możemy to zrobić w następujący sposób także:

results.stream() 
     .flatMap(res -> res.getSeries().stream()) 
     .flatMap(series -> series.getValues().stream()) 
     .collect(Collectors.toMap(
           vals -> vals.get(1).toString(), 
           vals -> vals.get(2).toString(), 
           (vals1,vals2) -> vals2, 
           ConcurrentHashMap::new); 
4

Można użyć Collectors.toConcurrentMap

results.stream() 
      .flatMap(res -> res.getSeries().stream()) 
      .flatMap(series -> series.getValues().stream()) 
      .collect(Collectors.toConcurrentMap(
            vals -> vals.get(1).toString(), 
            vals -> vals.get(2).toString())); 
+2

Brakuje niektórych wywołań 'flatMap()', ponieważ 'results' nie zawiera niczego, co" vals "jest. – Andreas

+2

@Andreas Dzięki –

+1

Normalny styl kodu zawiera spacje wokół '->'. Poprawia czytelność, gdy wspólne style kodu są honorowane. – Andreas