[Java] 람다함수, 이걸 안 써? - 내림차순 정렬, 2차원 배열 정렬, 가장 큰 수 만들기
람다 함수란?
이름이 없는 함수(익명함수)이다.
자바 8 이후로 함수형 인터페이스를 지원하고 있다.
<기본 구조>
람다 하수는 다음과 같은 형태로 표현된다.
( 매개변수 ) -> { 함수 몸체 }
예시
( int x, int y ) -> { return x + y }
- 매개변수 목록: (int x, int y) — 함수에 전달되는 매개변수
- 화살표 연산자 (->)
- 함수 몸체: { return x + y; } — 함수가 수행할 작업
람다함수의 장점
1. 간결함 : 익명 클래스봐다 훨씬 적은 코드로 표현할 수 있다.
기존의 익명 클래스 방식
// 익명 클래스로 Runnable 구현
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
⬇⬇⬇⬇⬇⬇
람다 함수로 변환
// 람다 표현식으로 Runnable 구현
Runnable runnable = () -> System.out.println("Hello, World!");
2. 함수형 프로그래밍 : 코드의 가독성과 유지보수가 쉬워진다.
3. 매개변수로 전달 가능 : 람다 함수를 메소드의 인자로 간편하게 전달할 수 있다. (함수를 매개변수로!😮)
람다 함수 활용법
1. 내림차순 정렬
자바의 Array.sort() 함수는 기본적으로 오름차순 정렬을 해준다.
내림차순으로 바꾸기 위해서는 아래코드와 같이
Arrays.sort(citationsInteger, Collections.reverseOrder());
두 번째 인자로 Collections 클래스의 reverseOrder() 메서드 리턴값을 전달인자로 주면 된다.
하지만 이 Collections에선 객체만 다룰 수 있기 때문에 int로 선언한 배열을 Integer로 바꿔주어야한다
Integer[] citationsInteger = Arrays.stream(citations).boxed().toArray(Integer[]::new);
때문에 코드가 너무 길고 복잡해진다......
하지만 람다 함수를 이용하면?!
Arrays.sort(jobs, (a, b) -> a - b); //오름차순
Arrays.sort(jobs, (a, b) -> b - a); //내림차순
오름차순, 내림차순 모두 이렇게 간단하게 표현할 수 있다.
(a, b) -> a - b ==> a가 b보다 작을 경우 음수 반환, 같으면 0, 클 경우 양수 반환
(a, b) -> b - a ==> 반대로 b가 a보다 작으면 음수, 크면 양수 반환
우선순위 큐에서도 오름차순으로 하려면 ..!
PriorityQueue<int[]> pQ = new PriorityQueue<>((a, b) -> a - b);
2. 2차원 배열 정렬
만약
2 100 1 91
4 56 2 100
1 91 -> 3 74
5 12 4 56
3 74 5 12
이러한 이차원 배열에서 0 번째 요소로 정렬을 하고 싶을 때도 람다함수를 사용하면 굉장히 간단하게 작성할 수 있다.
Arrays.sort(arr, (a,b) -> a[0] - b[0]); 0번째 요소를 기준으로 오름차순 정렬
Arrays.sort(arr, (a,b) -> b[0] - a[0]); 0번째 요소를 기준으로 내림차순 정렬
이게 끝이지롱!!!!!
3. 숫자를 조합해서 가장 큰 수를 만들 때!
[6, 10, 2] -> 6210
[3, 30, 34, 5, 9] -> 9534330
이렇게 주어진 수로 가장 큰 숫자를 만들어야할 때!!
Arrays.sort(arr, (o1, o2) -> (o2+o1).compareTo(o1+o2));
이렇게 간단할 수가 업땨...😲
3과 30을 비교하면 330 > 303 이기때문에 3이 앞에 오고
30과 34를 비교하면 3034 < 3430 이기때문에 34가 앞에 온다.
최종적으로 가장 큰 수를 만드는 순서인 9, 5, 34, 3, 30 으로 정렬이 되게 된다.
