- Lambda + Stream => 람다와 스트림
- javaScript arrowFunction(화살표함수)와 비슷한 형태
- Lambda : 람다식 (식을 단순하게 표현하는 방법)
외부 자료의 부수적인 영향(side effect)을 주지 않도록 구현하는 방법
- Stream : 자료의 대상과 관계없이 동일한 연산을 수행할 수 있도록 해주는 반복자
- 메서드 체이닝 기법을 사용
- Lambda functions : 익명클래스를 사용하여 쓰는 함수
| 람다식의 장점 | 람다식의 단점 |
| - 코드 간결성 - 병렬처리 가능 - 불필요한 연산 최소화 |
- 가독성이 떨어짐 - 반복문 사용시 성능 저하 |
- 람다의 표현식
// javaScript
const name = ( ) => { }
//java
( 매개변수 ) -> { 구현 }
- 매개변수가 1개면 ( ) 생략가능
x -> { return x + 1; }
(x, y) -> { return x + y; }
- return이 없으면 { } 생략가능
x -> x + 1;
x -> return x + 1; //오류
📢 실습(1) : 리스트 출력
package day09;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class Lambda01 {
public static void main(String[] args) {
// 정수 리스트 생성
List<Integer> list = new ArrayList<>();
// 리스트에 요소 추가
list.add(10);
list.add(20);
list.add(40);
list.add(60);
list.add(30);
list.add(50);
list.add(70);
list.add(80);
list.add(90);
// 1. 전통적인 for-each 루프를 사용하여 리스트의 요소 출력
for (Integer tmp : list) {
System.out.println(tmp); // 각 요소 출력
}
// 구분선 출력
System.out.println("--forEach 출력--");
// 2. 람다식을 사용하여 forEach 메서드로 리스트의 요소 출력
list.forEach(n -> {
System.out.println(n + " "); // 각 요소 출력
});
// 3. 주석 처리된 부분: 합계 계산 예제
// int sum = 0;
// list.forEach(n -> {
// sum += n; // 리스트의 모든 요소를 더함
// });
// 4. 람다함수(익명함수) 사용 예제
System.out.println();
System.out.println("--람다함수 사용 Consumer --");
// Consumer 인터페이스를 사용하여 람다 함수 정의
Consumer<Integer> method = (n) -> {
System.out.println(n + " "); // 각 요소 출력
};
// forEach 메서드에 Consumer 람다 함수 전달
list.forEach(method);
}
}
결과
10
20
40
60
30
50
70
80
90
--forEach 출력--
10
20
40
60
30
50
70
80
90
--람다함수사용 Consumer --
10
20
40
60
30
50
70
80
90
📢 실습(2) : HashMap 사용하여 데이터 처리
package day09;
import java.util.HashMap;
public class Lambda02 {
public static void main(String[] args) {
// HashMap을 생성하고 데이터 추가
HashMap<String, Integer> map = new HashMap<>();
map.put("hong", 70);
map.put("kim", 53);
map.put("lee", 98);
map.put("park", 85);
map.put("choi", 65);
map.put("ha", 45);
// 1. forEach 메서드를 사용하여 맵의 모든 키-값 쌍 출력
// Consumer: 값이 1개, BiConsumer: 값이 2개
map.forEach((key, value) -> {
System.out.println(key + ":" + value); // 각 키-값 쌍 출력
});
// 2. 사용자 정의 함수형 인터페이스 사용 예제
Number sum = (a, b) -> { // 함수 구현
return a + b; // 두 수의 합 반환
};
// 3. 두 수의 합을 계산하고 출력
int tot = sum.add(50, 60);
System.out.println(tot); // 결과 출력
}
}
// 4. 함수형 인터페이스 생성
// 메서드가 1개여야만 함.
@FunctionalInterface
interface Number {
int add(int a, int b); // 두 수를 더하는 메서드
// int sub(int a, int b); // 메서드가 2개면 오류 발생
}
결과
hong:70
choi:65
ha:45
lee:98
kim:53
park:85
110
'백엔드 > Java' 카테고리의 다른 글
| Java 파일 입출력 (I/O) 처리 (0) | 2024.11.04 |
|---|---|
| Java 스트림(Stream) (0) | 2024.10.30 |
| Java 제네릭(Generic) (1) | 2024.10.26 |
| Java로 상품 관리 시스템 구현(2) (0) | 2024.10.25 |
| Java로 단어장 구현 (0) | 2024.10.23 |