목차
람다식
- 코드 간결해짐
- 지연 연산 등을 통한 성능 향상 도모
- 그러나, 모든 요소들을 순회하는 경우엔 성능이 떨어질 수 있음
- 코드 분석이 어려울 수 있음
람다식 이전의 코드를 살펴보자
//MaxNumber Interface
public interface MaxNumber {
int getMaxNumber(int x, int y);
}
//MaxNumber Interface 구현 클래스
public class MaxNumberImpl implements MaxNumber {
@Override
public int getMaxNumber(int x, int y) {
return x >= y ? x : y;
}
}
public class Main {
public static void main(String[] args) {
// 인터페이스를 직접 클래스로 구현 후 메인 메소드에서 생성 후 호출
MaxNumber maxNumber = new MaxNumberImpl();
System.out.println(maxNumber.getMaxNumber(3,1));
}
}
//3
기존의 코드는
인터페이스를 생성 → 인터페이스 구현하고 class를 생성 → 인터페이스 타입의 참조변수에 인터페이스를 구현한 class 객체를 생성 및 대입하여 생성
람다식으로 구현해보자
public class Main {
public static void main(String[] args) {
// 람다식을 이용하여 호출 방식
MaxNumber maxNumber = (x, y) -> x >= y ? x : y;
System.out.println(maxNumber.getMaxNumber(3,1));
}
}
람다식 표현법
() → {};
() : 인터페이스의 추상 메서드에 대한 매개변수
{} : 인터페이스의 추상메소드에 대한 구현체
스트림 API란?(Stream)
JDK8 버전부터 제공된 컬렉션 혹은 배열에 저장된 요소를 하나씩 참조하여 람다 표현식으로 처리할 수 있는 반복자이다.
[과거 Iterator 사용]
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
Iterator iterator = numbers.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
[Stream을 사용한 반복처리]
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
Stream<Integer> stream = numbers.stream();
stream.forEach(number -> System.out.println(number));
Stream의 특징
람다표현식
스트림은 람다식으로 요소 처리 코드를 제공한다.
스트림이 제공하는 대부분의 요소 처리 메소드는 함수형 인터페이스를 사용하므로, 람다식으로 요소 처리 코드를 제공할 수 있다.
생성, 중간처리, 최종처리
재사용 불가능
스트림이 생성되고, 중간처리를 거쳐 최종처리까지 완료되면 닫히게 된다. 이미 닫힌 스트림은 재사용할 수 없으며, 재사용을 시도할 경우 예외가 발생한다.
즉 스트림은 일회용이다.
List<Integer> numbers = List.of(10, 20, 25, 15, 30, 35, 12, 24, 34);
Stream<Integer> integerStream = numbers.stream()
.filter(number -> number > 20);
integerStream.count();
// java.lang.IllegalStateException: stream has already been operated upon or closed
Stream 사용법
먼저 student 클래스를 정의한다.
class Student {
private final int grade;
private final int score;
Student(final int grade, final int score) {
this.grade = grade;
this.score = score;
}
public int getGrade() {
return grade;
}
public int getScore() {
return score;
}
그 다음 학생 컬렉션을 준비한다.
List<Student> students = List.of(
new Student(2, 100),
new Student(3, 50),
new Student(1, 56),
new Student(2, 90),
new Student(3, 90),
new Student(2, 100),
new Student(1, 30)
);
double averageScore = students.stream() // Stream 생성
.filter(student -> student.getGrade() == 3) // 필터링 (중간처리)
.mapToInt(student -> student.getScore()) // 매핑 (중간처리)
.average() // 평균 집계 (최종처리)
.getAsDouble();
System.out.println("평균 성적: " + averageScore); // 70.0
주요 Stream API
map()
- Stream 클래스의 메소드
- filter와 같은 다른 Stream 메소드를 호출하거나 이를 수집하여 변환
- chain 생성
출처
https://woo0doo.tistory.com/21
'Java' 카테고리의 다른 글
Java : 접근 제어 지시자 (access modifier) & 캡슐화 (0) | 2023.12.12 |
---|---|
Java : 객체 지향 프로그래밍 (0) | 2023.12.12 |