마트철수

[039] Java: 람다식, 스트림 본문

KB IT's Your Life/교육

[039] Java: 람다식, 스트림

마트스 2024. 7. 4. 08:50

 

2024.07.03(수)
 
JAVA 11일차
 
클래스는 필드, 생성자, 메서드 → #필생메
상속은 메소드 오버라이딩,  다형성, 추상 → #메오다추
문자열은 String 타입 → substring, indexOf, split
main 메소드(혹은 생성자) 안에 위치하면 → 로컬 클래스
 


 

ch16 람다식

 

람다식

- 함수형 프로그래밍: 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법

- 람다식: 데이터 처리부에 제공되는 역할을 하는 매개변수를 가진 중괄호 블록

# 람다식은 타입이 맞는 경우에만 넘길 수 있음

# 람다가 없었을 때에는 익명 구현 객체로 정의했었음

 

함수형 인터페이스

:인터페이스가 단 하나의 추상 메소드를 가지는 것 → 람다로 정의할 수 있음 ... ( ) -> { ... }

@FunctionalInterface: ... 인터페이스가 함수형 인터페이스임을 보장

 

매개변수가 없는 람다식

- 두 줄 이상이면 중괄호 필수 / 하나면 중괄호 생략 가능

 

매개변수가 있는 람다식

- 함수형 인터페이스의 추상 메소드에 매개변수가 있을 경우

# (매개변수, ...) -> 실행문

# 전달할 수 있는 인터페이스가 무엇인지 파악하는 것이 중요함

# static에서는 this 사용 불가

 

메소드 참조

: 메소드를 참조해 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거

: 단순화 가능 ... Math :: max;

# static 메소드인지 인스턴스 메소드인지 구분

 

▼ String a, String → a.compareTo(b)로 넘기면 됨 ▼

생성자 참조
(a, b) -> { return new 클래스(a, b); }, 클래스 :: new

 

ch17 스트림

 

스트림

: 흐름, 한 번 흘려보내면 다시 쓸 수 없음

 

내부 반복자

: 요소 처리 방법을 컬렉션 내부로 주입시켜서 요소를 반복 처리

 

ParallelStreamExample.java

Stream<String> parallelStream = list.parallelStream( ); ... 병렬로 처리

 

중간 처리와 최종 처리

: 컬렉션의 오리지널 스트림 뒤에 필터링 중간 스트림이 연결될 수 있고, 그 뒤에 매핑 중간 스트림이 연결될 수 있음

- 중간 처리와 최종 처리로 구분할 수 있음

- 최종 처리는 1개, 중간 처리는 N개

- 실제 데이터는 최종 처리가 호출될 때, 데이터가 흐르며 실행됨

- 중간 스트림들은 최종 처리를 위해 필터링, 매핑, 정렬하는 작업을 수행함

 

리소스로부터 스트림 얻기

: java.util.stream 패키지에는 BaseStream 패키지를 부모로 함

: Colletion과 배열 가장 많이 사용함 (★)

 

요소 걸러내기(필터링)

: 필터링은 요소를 걸러내는 중간 처리 기능 #데이터가 흐르지 않음

: 타입은 유지되나, 개수가 변경됨

 

- distinct( ) 메소드: 중복 제거

- filter( ) 메소드: true인 값만 리턴

- Predicate: 함수형 인터페이스 (하나만 정의되어있음)

 

# 람다식은 Functional Interface가 필요함 → 범용적으로 사용할 수 있도록 준비해둠

 

FilteringExample.java

list.stream( )
   .distinct( )
   .forEach( n -> sout(n));

 

요소 변환(매핑)

: 모든 function은 매개값을 리턴값으로 매핑하는 applyXxx( ) 메소드를 가짐

 

MapExample.java

studentList.stream( )
   .mapToInt(s -> s.getScore())
   .forEach(score -> sout(score));

> Student :: getScore 로 변경 가능

 


 

- 람다식 이해 > 메소드 참조 이해 > 메소드 참조로 대체할 수 있는지 생각

- 매개변수만 처리하는 경우만 메소드 참조 가능