일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 컴파일시스템
- stringreader
- CSS 기초
- K-MOOC
- 디스크블록할당
- 딥러닝
- StringTokenizer
- Entity
- 오블완
- 머신러닝
- 혁신의기술2:신뢰의미래 블록체인을 만나다
- 해시
- national instruments
- 블록체인 강의
- 자바입력받기
- 자바문자열구분
- StringBuilder
- Node
- 2차원배열정렬
- 블록체인강의
- 단국대학교 k-mooc
- 우선순위큐
- attribute
- biginteger사용법
- 자바스크립트
- 블록체인
- K-MOOC 단국대학교 홍보단
- 시스템프로그래밍
- 티스토리챌린지
- html기초
- Today
- Total
열정 실천
[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 으로 정렬이 되게 된다.
'개발 공부 > JAVA' 카테고리의 다른 글
[JAVA] 객체의 형변환 - 업캐스팅(묵시적 형변환), 다운캐스팅(명시적 형변환) (0) | 2024.10.07 |
---|---|
[JAVA] StringReader, StringTokenizer, StringBuilder 자바로 알고리즘 문제 풀려면 이거는 기본! (0) | 2024.03.08 |
자바 입력받기 StringReader, StringTokenizer (0) | 2024.03.04 |
[JAVA] 자바에서의 형변환 (String to int, float, long) (string to char (char to int) (0) | 2022.07.21 |
[JAVA] Int, Double 범위를 벗어나면 BigInteger로 처리하자!!! (0) | 2022.07.06 |