
스트림 과정

함수형 인터페이스 와 메소드

이론 정리 게시판
## 1교시
람다식
1. 함수형 인터페이스
단일 추상 메서드가 있는 인터페이스는 함수형 인터페이스라고 함
Java에서 람다 표현식은 기본적으로 함수형 인터페이스의 인스턴스인 것처럼 전달되어 요구에 따라 실행 (인스턴스가 사실상 생성되지 않음)
람다 표현식은 익명 함수입니다. 이러한 함수는 이름이나 클래스 없이 사용할 수 있습니다.
## 2교시
람다의 메소드 참조, this, 생성자 참조
### this
lambda는 해당 lambda 식이 작성된 class의 instance를 reference 합니다(this)
### 메소드 참조
람다식의 메소드 참조 문법을 사용하기 위해서는 다음의 3가지 조건을 만족하면 된다.
- 함수형 인터페이스의 매개변수 타입 == 메소드의 매개변수 타입
- 함수형 인터페이스의 매개변수 개수 == 메소드의 매개변수 개수
- 함수형 인터페이스의 반환 타입 == 메소드의 반환 타입
|종류|람다 표현식|메서드 참조|
| --- | --- | --- |
|정적 메서드 참조|(x) -> ClassName.method(x)|ClassName::method|
|인스턴스 메서드 참조|(x) -> obj.method(x)|obj::method|
|매개변수의 메서드 참조|(obj, x) -> obj.method(x)|ClassName::method|
|생성자 참조|(x, y) -> new ClassName(x, y)|ClassName::new|
### 3교시
스트림
Java 8에 도입된 Stream API는 객체 컬렉션을 처리하는 데 사용됩니다. Java의 스트림은 원하는 결과를 생성하기 위해 파이프라인으로 연결할 수 있는 다양한 메서드를 지원하는 객체 시퀀스입니다.
스트림은 원래 데이터 구조를 변경하지 않고, 파이프라인된 메서드에 따라 결과만 제공합니다.
#### Intermediate Operations 중간 작업
메서드는 서로 연결되어 있습니다
중간 작업은 스트림을 다른 스트림으로 변환
메서드에서 데이터를 필터링하여 처리 후 다른 메서드에 전달하는 필터링 개념이 가능
병렬화 가능
##### 메서드 목록
map : 주어진 함수를 이 스트림의 요소에 적용한 결과로 구성된 스트림을 반환
filter : 인수로 전달된 Predicate에 따라 요소를 선택하는 데 사용
sorted : 스트림을 정렬하는 데 사용
distinct : 중복 제거
기타 등등
#### Terminate Operations 종료 작업
결과를 반환하는 유형의 Operations입니다. 이러한 Operations는 더 이상 처리되지 않고 최종 결과 값만 반환합니다.
##### 메서드 목록
collect : 스트림에서 수행된 중간 작업의 결과를 반환
forEach : 스트림의 모든 요소를 반복하는 데 사용
reduce : 스트림의 요소를 단일 값으로 축소하는 데 사용
기타 등등
Q. 람다를 사용하는 방법이
1. 인터페이스 생성------------------------------------------------class_1
2. 메소드 생성 (데이터 입력)--------------------------------------class_2
3. 인터페이스 생성 및 사용 부분에서 람다식으로 구현 및 사용-------class_3
인 것으로 이해 했는데, 사용하기 번거롭게 느껴집니다. 단순히 전략패턴 구현을 위해 람다를 사용하는 건가요?
A. 람다 표현식은 익명 함수입니다. 이러한 함수는 이름이나 클래스 없이 사용할 수 있습니다. 이게 주 목적입니다
이 덕분에 스트림에서도 적극적으로 활용 될 수 있습니다.
전략패턴과는 무관합니다.
### 람다참조를 간략하게 표현하기 위해 단축문법을 사용하기도 합니다
1. 정적 메서드 참조
(x) -> ClassName.method(x)
ClassName::method
2. 인스턴스 메서드 참조
(x) -> obj.method(x)
obj::method
3. 매개변수의 메서드 참조
(obj, x) -> obj.method(x)
ClassName::method
4. 생성자 참조
(x, y) -> new ClassName(x, y)
ClassName::new
### 생성이 아니라 참조를 위한 것이고 인스턴스를 생성하지 않아도 되는 특징이 있습니다
Java에서 람다 표현식은 기본적으로 함수형 인터페이스의 인스턴스인 것처럼 전달되어 요구에 따라 실행 (인스턴스가 사실상 생성되지 않음)
실제로 인스턴스가 생성되지 않기 때문에 this가 참조할 인스턴스가 없어서 상위 인스턴스를 바라보게 됩니다.
-----------------
Predicate란? argument를 받아 boolean 값을 반환하는 함수형 인터페이스
