kimmgamjja
[Java] stream sorted(정렬), 람다 표현식 본문
자바에서 리스트 정렬하는 방법 중에 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 가 내가 원하는 정렬기준컬럼과 정렬방향으로 정렬된다.
'공부 > Java' 카테고리의 다른 글
[Java] Spring 에서 DB 연결 (2) | 2025.02.28 |
---|---|
[Java] 2개 이상의 DB 연동 및 접속 (0) | 2025.02.28 |
[Java] Exception>java.lang.NumberFormatException++Exception Message>For input string: "10000000000"++Stack Trace>java.lang.NumberFormatException: For input string: "10000000000" (1) | 2025.02.14 |
[Java] Collections.swap()으로 요소 위치 바꾸기 (0) | 2025.01.23 |
[Java] String.valueOf()와 Object.toString() (0) | 2025.01.23 |