2017-11-28 6 views
2

스트림의 2 가지 속성 속성을 조합하여 결과를 그룹화하려는 작은 스 니펫 코드가 있습니다. 적절한 필터링을 한 후이 두 속성 (이 경우 AirportDay)을 보유하는 간단한 유형의 인스턴스를 만드는지도를 작성합니다. 이제 저는 그것들을 그룹화하고 카운트에 따라 내림차순으로 정렬하기를 원합니다. 내가 겪고있는 문제는 groupingBy 메서드에 대한 올바른 인수가 떠오르고 있습니다. 여기 내 코드는 지금까지 있습니다 :groupingBy를 사용하는 Java Stream.collect

final int year = getYear(); 
final int limit = getLimit(10, 1, 100); 

repository.getFlightStream(year) 
      .filter(f -> f.notCancelled()) 
      .map(f -> new AirportDay(f.getOriginAirport(), f.getDate())) 
      .collect(groupingBy(????? , counting()))  // stuck here 
      .entrySet() 
      .stream() 
      .sorted(comparingByValue(reverseOrder())) 
      .limit(limit) 
      .forEach(entry -> { 
      AirportDay key = entry.getKey(); 
      printf("%-30s\t%s\t%,10d\n", 
        key.getAirport().getName(), 
        key.getDate(), 
        entry.getValue() 
      ); 
      }); 

나의 첫번째 본능 AirportDay이 : 그 그러나 이것은 분명히 작동하지 않습니다 통과했다 ... 난 당신이 오는에 제공 할 수있는 모든 지원을 감사하겠습니다

위의 문제에 대한 해결책을 제시하십시오.

당신이 AirportDay으로 그룹화 할 경우, groupingBy의 열쇠 만들 수있는 기능을 제공

답변

1

토니 :

repository.getFlightStream(year) 
     .filter(f -> f.notCancelled()) 
     .collect(groupingBy(f -> new AirportDay(f.getOriginAirport(), f.getDate()), counting())) 

참고 : AirportDay 클래스는이에 대한 합리적인 equals()hashCode() 메소드를 구현해야합니다 작업.

+0

두 개의 매개 변수가있는 유형을 사용하는 PairGroup이라는 일반 클래스를 만들었으므로 다른 속성 쌍을 함께 사용할 때 사용할 수 있습니다. 'PairGroup 클래스를 구현합니다. 은 Comparable > –

+0

을 구현합니다. @TonyPiazza 2 개의 속성으로 만 그룹화하려는 경우'List'를 사용하여 다음과 같이 그룹화 할 수 있습니다 :'.collect (groupingBy (f -> Arrays .asList (f.prop1, f.prop2))'... –