2017-11-18 1 views
1

다음 구조체를 다루고 있습니다.람다를 사용하여 중첩 된 HashMaps 이상으로 계산

Map<String, HashMap<Integer, HashMap<Integer, Integer>>> ... 

내부 HashMap의 값으로 카운터를 증가시키고 싶습니다. 반복 함수 또는 중첩 루프를 사용하면 쉽게 그 작업을 수행 할 수 있습니다. 그러나 lambda를 사용하여 우아한 솔루션을 찾고 있습니다.

+0

정확하게 이해하면, 가장 안쪽의'Map '의 값의 합을 얻고 싶습니까? – 4castle

+0

정확 하 게, 내 목표는 –

+3

귀하의 질문에 지금 그대로 남아 있습니다. "counter counter"는'counter = counter + 1; '로 해석 될 수 있지만 여전히'counter'라고 생각하는 것을 모른다. [편집] 옵션을 사용하여 질문을 명확히하십시오 (입력 및 예상 결과의 예가 바람직 함). – Pshemo

답변

5

Map의 값 중 Stream을 얻으려면 .values().stream()을 사용할 수 있습니다. 그런 다음 Stream<Integer>을 얻을 때까지 반복하여 중첩 된 구조를 벗겨 내기 위해 .flatMap을 적용 할 수 있습니다. 그런 다음를 입력하여 IntStream을 생성하여 .sum()의 모든 값을 얻을 수 있습니다.

int sum = outerMostMap.values().stream() // HashMap<Integer, HashMap<Integer, Integer>> 
    .flatMap(map -> map.values().stream()) // HashMap<Integer, Integer> 
    .flatMap(map -> map.values().stream()) // Integer 
    .mapToInt(Integer::intValue)   // int 
    .sum(); 
+0

또는 람다가 필요없는 경우'flatMap (map -> ...) '대신'.map (Map :: values) .flatMap (Collection :: stream)'을 사용하십시오. – Zabuza

+1

OP 및 향후 독자를위한 귀하의 접근 방식을 설명 할 수 있습니까? – Zabuza

+0

우아한 해결책을 가져 주셔서 감사합니다! 출력이 정확합니다. 좀 더 설명해 주시겠습니까? –