람다(Lambda)
1. 람다(Lambd) 표현식
람다 표현식(Lambda Expression)은 익명 함수를 생성하기 위한 간결한 문법으로, Java 8에서 도입되었다.
- 코드의 간결성과 가독성을 높임
- 주로 함수형 인터페이스(Functional Interface)와 함께 사용
✏️ 함수형 인터페이스 (Functional Interface)
Java에서 함수형 인터페이스는 단 하나의 추상 메서드만 가지는 인터페이스를 의미한다.
람다 표현식이나 메서드 참조를 지원하는 기반이다.
2. 기본 문법
(매개변수) -> { 실행문 }
- 매개변수 : 함수에 전달할 값. 매개변수가 1개면 괄호 생략 가능
- -> : 람다 표현식의 매개변수와 실행문을 구분
- 실행문 : 메서드의 본문으로, 한 줄일 경우 중괄호{} 생략 가능
3. 람다 표현식 예제
람다를 사용하면 불필요한 코드(클래스 선언, 메서드 명 등)를 줄일 수 있다.
Thread Runnable 객체 생성 예시
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable 실행");
}
};
new Thread(runnable).start();
- Runnable 객체를 익명 클래스 형태로 생성
Runnable runnable = () -> System.out.println("Runnable 실행");
new Thread(runnable).start();
- Runnable을 람다 표현식으로 간단히 정의
4. 함수형 인터페이스와의 관계
함수형 인터페이스는 인터페이스에 단 하나의 추상 메서드만 정의되어야 한다.
람다 표현식으로 함수형 인터페이스의 추상 메서드를 구현할 수 있다.
함수형 인터페이스 예제
@FunctionalInterface
interface Calculator {
int operate(int a, int b);
}
public class Main {
public static void main(String[] args) {
// 람다 표현식을 사용하여 Calculator 구현
Calculator add = (a, b) -> a + b;
Calculator multiply = (a, b) -> a * b;
System.out.println("덧셈 결과: " + add.operate(5, 3)); // 출력: 8
System.out.println("곱셈 결과: " + multiply.operate(5, 3)); // 출력: 15
}
}
스트림(Stream) API
1. 스트림(Stream) API
Java 8에서 도입된 Stream API는 데이터를 처리하는 데 있어 함수형 프로그래밍 스타일을 제공한다.
스트림은 java.util.stream 패키지에 포함된 API이며 데이터를 처리하기 위한 연산의 집합(filter, map, collect 등)을 제공한다.
- 데이터를 순차적 또는 병렬적으로 처리할 수 있다.
- 데이터를 처리하는 파이프라인을 형성하여 간결하고 효율적인 코드를 작성할 수 있다.
특징
- 데이터 소스(컬렉션, 배열 등)에서 데이터를 추출하여 처리
- 데이터를 필터링, 변환, 집계하는 연산 제공
- 중간 연산과 최종 연산으로 구성
- 중간 연산 : 스트림 변환 (filter, map)
- 최종 연산 : 스트림을 결과로 변환 (forEach, collect) - 스트림은 한 번 소비되면 재사용 불가
2. 스트림의 주요 메서드
- 중간 연산
- filter(Predicate) : 조건에 맞는 요소 필터링
- map(Function) : 각 요소를 변환
- sorted() : 요소를 정렬 - 최종 연산
- forEach(Comsumer) : 각 요소를 소비
- collect() : 결과를 컬렉션으로 반환
- reduce() : 요소를 하나의 값으로 줄임
3. 스트림 API 예제
데이터 필터링과 변환
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 이름이 "A"로 시작하는 요소 필터링 및 변환
names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.forEach(System.out::println); // 출력: ALICE
}
}
숫자 데이터의 집계
import java.util.stream.IntStream;
public class StreamSumExample {
public static void main(String[] args) {
int sum = IntStream.range(1, 6) // 1부터 5까지의 숫자
.sum(); // 합산
System.out.println("Sum: " + sum); // 출력: Sum: 15
}
}
리스트 정렬 및 수집
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamSortExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);
// 정렬 후 수집
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 출력: [1, 2, 3, 4, 5]
}
}
4. 람다와 스트림 API
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 스트림 API + 람다
names.stream()
.filter(name -> name.startsWith("A")) // filter 메서드는 API
.map(String::toUpperCase) // map 메서드는 API
.forEach(System.out::println); // forEach 메서드는 API
}
}
- stream(), filter(), map(), forEach() 는 스트림 API에서 제공하는 메서드
- 람다 표현식 name -> name.startWith("A")을 스트림 API와 결합하여 동작
'TIL (Today I Learned)' 카테고리의 다른 글
[Java] 스택 자료구조: Stack과 Deque 비교 (0) | 2025.01.10 |
---|---|
[TIL] Java 계산기 만들기 과제 회고 🤓✏️ (0) | 2025.01.09 |
[TIL] Java Enum과 Generic 활용하여 계산기 만들기 (25-01-06) (1) | 2025.01.06 |
[Java] Generic의 원리와 활용법 (0) | 2025.01.06 |
[Java] Enum 사용법과 활용 예시 (0) | 2025.01.06 |