2017-10-04 15 views
3

나는 Test라는 클래스가 있습니다. 이 클래스에는 int 값을 반환하는 getNumber라는 메서드가 있습니다.지도에 스트림을 사용하여 최대 값 가져 오기

public class Test{ 
    . 
    . 
    . 
    . 
    public int getNumber(){ 
      return number; 
    } 
} 

또한 키가 Long이고 값이 Test 개체 인 HashMap이 있습니다.

Map<Long, Test> map = new HashMap<Long, Test>(); 

스트림 선 코드를 사용하여 최대 getNumber를 갖는 키와 getNumber를 인쇄하려고합니다. 내 질문에 내가 최대 크기의 키를 어떻게 반환 할 수있다 그러나

나는 줄

final Comparator<Test> comp = (p1, p2) -> Integer.compare(p1.getNumber(), p2.getNumber()); 

map.entrySet().stream().map(m -> m.getValue()) 
    .max(comp).ifPresent(d -> System.out.println(d.getNumber())); 

아래를 통해 최대 수를 인쇄 할 수 있습니까? 스트림을 사용하여 한 라운드로 할 수 있습니까?

답변

1

내가 제대로 이해하는 경우 :

Entry<Long, Test> entry = map.entrySet() 
      .stream() 
      .max(Map.Entry.comparingByValue(Comparator.comparingInt(Test::getNumber))) 
      .get(); 
+0

그것은 매력처럼 작동합니다. 고마워요. –

+1

비싼'.sorted (...) .findFirst()'로 바꾸는 이유가 없습니다. 당신은 여전히 ​​OP의 코드 에서처럼'max'를 사용할 수 있습니다. 단 하나의 트릭은'map' 단계를 수행하지 않는 것입니다 :'map.entrySet() .stream() .max (Map.Entry.comparingByValue (Comparator.comparingInt (Test :: getNumber))) .get()' – Holger

+0

@Holger 다시, 틀렸어, 편집 했어 – Eugene

1

당신은 키 - 값 쌍은 테스트 인스턴스의 최대 '수'값에 대응 찾으려면, 당신은 비교하는 비교기와 함께 Collections.max()을 사용할 수 있습니다 이 기준을 가진 출품작. 당신이 (당신이 값과 관련된 키를 분실 때문에) 다음 매핑을 제거, 스트림 방식을 사용하고, 동일한 비교를 제공하려면

import static java.util.Comparator.comparingInt; 

... 

Map.Entry<Long, Test> maxEntry = 
    Collections.max(map.entrySet(), comparingInt(e -> e.getValue().getNumber())) 

:

map.entrySet() 
    .stream() 
    .max(comparingInt(e -> e.getValue().getNumber())) 
    .ifPresent(System.out::println); 

참고는이 있음 첫 번째 스 니펫은 제공된지도가 비어있는 경우 NoSuchElementException을 던집니다.

관련 문제