2017-12-02 9 views
1

나는 JavaOne video By Venkat Subramanian about lambdas을보고있었습니다. 이 방법keySet 대신 groupingBy에 대한 엔트리 세트를 스트리밍

Map<String, Integer> scores = new HashMap<>(); 
    scores.put("Jack", 12); 
    scores.put("Jill", 15); 
    scores.put("Tom", 11); 
    scores.put("Darla", 15); 
    scores.put("Nick", 15); 
    scores.put("Nancy", 11); 
    System.out.println(groupByScores(scores)); 

:

그는이 같은 예를했다

public static Map<Integer, List<String>> groupByScores(Map<String, Integer> scores) { 
    return scores.keySet().stream().collect(Collectors.groupingBy(scores::get)); 
} 

이 본질적지도를 호출의 keySet 반복 것이다에 대해 조금 귀찮은의 한 가지. 각 키에 대해 get (key). 하지만 반 구체 코드 인 반 패턴입니다.

"peopleByAge"지도를 생성하는 동일한 결과를 얻을 수 있지만 대신에 keySet을 반복하면 어떻게됩니까? 단단한 부분은 분명히 과거의 모든 것입니다. stream().

+1

하지만 map.get (key) O (1) 연산이 아닙니다. – Solace

+0

@ Solace 그러나 그때조차도, 해시 계산과 더 많은 구현 특정 항목이 있어야합니다. 나는 entrySet 기능이 있다는 것을 고려하면 꽤 불필요하다고 느낀다. – Izruo

+0

@ David : 비디오에 연결할 수 있습니까? 그렇지 않으면 관련성이 없습니다. – Borodin

답변

-1
return scores.entrySet().stream() 
      .collect(Collectors.groupingBy(Map.Entry::getValue, 
        Collectors.mapping(Map.Entry::getKey, 
             Collectors.toList()))); 
+0

들여 쓰기가 이상합니다. 한 줄 끝에 여러 개의 닫는 괄호를 접어 쓰지 마십시오. 의도 한 것이 맞는지 확인하십시오. – Borodin

+0

나는 당신의 코멘트의 마지막 부분을 이해하지 못한다. 나는 그것이 무엇을하는지 안다. –

+0

4 개의 닫는 괄호를 계산하거나 컴파일러를 사용하지 않고 동일한 닫는 괄호가 올바른지 아무도 확신 할 수 없습니다. 따라서 일반 사용자에게는 코드가 직관력이 떨어지며 적절한 들여 쓰기가 필요한 이유가됩니다. 코드가 제대로 기능을 수행하지 못하기 때문에 코드가 잘못되었습니다. 'scores.entrySet(). stream()'을 개별적으로 추출하고 "똑똑한"코드는 피하십시오. – Borodin