티스토리 뷰

Java 8 – Sorting stream on multiple fields

  • Java를 사용하면서 데이터 집합을 Sorting을 할 때 조건, 필드가 여러가지가 될 수가 있다.
  • 이때 여러 필드를 비교 하는 방법을 알아보고자 한다.

방법

  • 우선 실제 상황을 가정하고 설명을 하는 것이 좋을 것 같다.
  • 아래와 같은 데이터 클래스가 있다고 가정을 해보자.
    • 정렬은 1차적으로 dateTime으로 한뒤 만약 같다면 sequnceNumber로 정렬을 해야 한다고 가정
public class CustomData {
    private ZonedDateTime dateTime;
    private int sequnceNumber;

	//getter, setter, 생성자 생략
}

필드 각각에 대한 comparators 생성

  • 필드 각각에 대한 comparator를 생성 해준뒤 이들을 결합해주는 comparator를 생성하여 sort 조건에 넣어주는 방식이다.
//dateTime comparator
Comparator<CustomData> compareByDateTime = Comparator.comparing( CustomData::getDateTime );
 
//last sequenceNumber comparator
Comparator<CustomData> compareBySequenceNumber = Comparator.comparing( CustomData::getSequenceNumber );
 
//Compare by dateTime and then sequenceNumber (multiple fields)
Comparator<CustomData> compare = compareByDateTime.thenComparing(compareBySequenceNumber);
 
//Using Comparator - pseudo code
list.stream().sorted( compare ).collect();

스트림 내부에서 사용

  • 위 예제와 동일한 원리의 코드를 사용한다.
    • 개인적으로 좀더 심플한 것 같음
Comparator<CustomData> compare = Comparator
			.comparing(CustomData::getDateTime)
			.thenComparing(CustomData::getSequenceNumber);

List<CustomData> sortedList = list.stream()
			.sorted(compare)
			.collect(Collectors.toList());

참고

 

Java 8 - Sorting stream on multiple fields - Group by sort example

Java 8 example to sort stream of objects by multiple fields using comparators and Comparator.thenComparing() method. Java stream group by sort example.

howtodoinjava.com


끝으로

이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다! 

 

반응형
댓글