kimmgamjja

[Java] stream sorted(정렬), 람다 표현식 본문

공부/Java

[Java] stream sorted(정렬), 람다 표현식

인절미댕댕이 2025. 2. 28. 10:21
728x90

 자바에서 리스트 정렬하는 방법 중에 Stream sorted() 방법이 있다

 

나는 

 

- 컨트럴러 : 사용자 요청에서 정렬방향( sort ), 정렬 기준 컬럼 ( sortTxt)를 파라미터로 받아옴

- 서비스단 : 받은 파라미터를 기반으로 Java Stream API 의 sorted() 메서드 사용하여 리스트 정렬

 

이러한 형태로 작업했다

 

* 서비스단 : 

List<Map<String, Object>> list = new LinkedList<>();
list.addAll(resultList);

if(sort.indexOf("asc") > -1){ // 오름차순
	if(sortTxt.indexOf("NUMBER_1") > -1 ){ 
		list = list.stream()
			.sorted((s1, s2) ->  Long.valueOf(s1.get(sortTxt).toString()).compareTo(Long.valueOf(s2.get(sortTxt).toString())))
			.collect(Collectors.toList());
	} else if(sortTxt.indexOf("NUMBER_2") > -1 ){ // sortTxt -> 정렬할 컬럼 이름
		list = list.stream()
			.sorted((s1, s2) ->  Double.valueOf(s1.get(sortTxt).toString()).compareTo(Double.valueOf(s2.get(sortTxt).toString())))
			.collect(Collectors.toList());
	} 
} else{ // 내림차순
	if(sortTxt.indexOf("NUMBER_1") > -1 ){ 
		list = list.stream()
			.sorted((s1, s2) -> Long.valueOf(s2.get(sortTxt).toString()).compareTo(Long.valueOf(s1.get(sortTxt).toString())))
			.collect(Collectors.toList());
	} else if(sortTxt.indexOf("NUMBER_2") > -1 ){ // sortTxt -> 정렬할 컬럼 이름
		list = list.stream()
			.sorted((s1, s2) ->  Double.valueOf(s2.get(sortTxt).toString()).compareTo(Double.valueOf(s1.get(sortTxt).toString())))
			.collect(Collectors.toList());
	}
}

 

1) list.stream()

List<Map<String, Object>> 타입의 리스트 list 를 스트림으로 변환한다

(스트림은 데이터 집합에 대해 일련의 연산을 수행할 수 있는 기능을 제공한다)

 

2) sorted((s1, s2)  -> Long.valueOf  ~ )

- stream의 sorted() 메서드

- ( s1, s2 )  -> 는 람다표현식으로, 2개의 요소 s1, s2를 비교하는 방식 / s1, s2는 Map<String, Object> 타입의 객체

 

3) comparedTo()

Long.valueOf( s1.get(sortTxt).toString()).compareTo( Long.valueOf(s2.get(sortTxt).toString()) )
Double.valueOf(s1.get(sortTxt).toString()).compareTo( Double.valueOf(s2.get(sortTxt).toString()) )

 

- Long 클래스, Double 클래스의 compareTo() 메서드는 두 Long 객체 혹은 Double 객체를 비교

- 반환값 : 0 ( 두 값이 같음 ), 음수 ( s1 가 s2 보다 작음 ), 양수 ( s1이 s2보다 큼)

 

4) .collect(Collectors.toList());

list.stream()
.sorted((s1, s2) -> Long.valueOf(s2.get(sortTxt).toString()).compareTo(Long.valueOf(s1.get(sortTxt).toString())))
.collect(Collectors.toList());

 

- 정렬된 스트림을 다시 List 로 변환 

 

 

5) 내림차순의 경우 오름차순과 다르게 s1 과 s2의 위치를 바꿔서 비교

오름차순 - Long.valueOf(s1.get(sortTxt).toString()).compareTo(Long.valueOf(s2.get(sortTxt).toString())))

내림차순 - Long.valueOf(s2.get(sortTxt).toString()).compareTo(Long.valueOf(s1.get(sortTxt).toString())))

if(sortTxt.indexOf("NUMBER_1") > -1 ){
    list = list.stream() 
    .sorted((s1, s2) -> Long.valueOf(s2.get(sortTxt).toString()).compareTo(Long.valueOf(s1.get(sortTxt).toString()))) 
    .collect(Collectors.toList());
} else if(sortTxt.indexOf("NUMBER_2") > -1 ){// sortTxt -> 정렬할 컬럼 이름
	list = list.stream() 
    .sorted((s1, s2) -> Double.valueOf(s2.get(sortTxt).toString()).compareTo(Double.valueOf(s1.get(sortTxt).toString()))) 
    .collect(Collectors.toList());
}

 

이런식으로 하면 s1과 s2의 값을 비교해서 list 가 내가 원하는 정렬기준컬럼과 정렬방향으로 정렬된다.

728x90