본문 바로가기
공부/JAVA

231026 자바의정석 (람다식, 함수형 인터페이스, java.util.function, 스트림, 메서드참조 )

by 예림220 2023. 10. 26.

Ch14 1~4 [람다식, 람다식 작성하기]

람다식

- 함수(메서드)를 간단한 식으로 표현하는 방법

- 익명 함수 (이름이 없는 함수)

- 함수와 메서드의 차이 

          근본적으로 동일. 함수는 일반적 용어. 메서드는 객체지향개념 용어

          함수는 클래스에 독립적, 메서드는 클래스에 종속적 

 

람다식 작성하기 

1. 메서드의 이름과 반환타입을 제거하고 ->를 블룩{}앞에 추가한다.

2. 반환값이 있는 경우, 식이나 값만 적고 return문 생략가능 (끝에 ; 안 붙임)

3. 매개변수의 타입이 추론 가능하면 생략가능 (대부분의 경우 생략가능) 

 

람다식 작성시, 주의사항

1. 매개변수가 하나인 경우, 괄호 () 생략가능 (타입이 없을 때만)

2. 블록 안의 문장이 하나뿐 일 때, 괄호 {} 생략 가능 (끝에 ; 안 붙임)

          단, 하나뿐인 문장이 retur문이면 괄호 {} 생략 불가 

 

람다식은 익명 함수? 익명 객체! 

- 람다식은 익명 함수가 아니라 익명 객체이다.

- 람다식(익명 객체)을 다루기 위한 참조변수가 팔요. 참조변수의 타입은? Object ? (x) > 함수형 인터페이스가 필요하다. 

 

Ch14 5, 6 [함수형 인터페이스]

- 함수형 인터페이스: 단 하나의 추상 메서드만 선언된 인터페이스 

- 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음. 

 

Ch14 7, 8 [java.util.function패키지]

- 자주 사용되는 다양한 함수형 인터페이스를 제공 

( java.lang.Runnable / Supplier<T> / Consumer<T> / Function<T,R> / Predicate<T> ) 

- 매개변수가 2개인 함수형 인터페이스 

( Biconsumer <T,U> / BiPredicate <T,U> / BiFunction<T,U,R> ) 

- 매개변수의 타입과 반환타입이 일치하는 함수형 인터페이스 

( UnaryOperator<T> / BinaryOperator<T> ) 

 

Ch14 - 9~12 [Predicate의 결합/ CF와 함수형 인터페이스]

Predicate의 결합

- and(), or, negate()로 두 predicate를 하나로 결합 (default메서드)

- 등가 비교를 위한 predicate의 작성에는 isEqual()를 사용 (static메서드) 

 

컬렉션 프레임웍과 함수형 인터페이스 

- 함수형 인터페이스를 사용하는 컬렉션 프레임웍의 메서드

 

Ch14 - 13, 14 [메서드 참조, 생성자의 메서드 참조]

메서드 참조 

- 하나의 메서드만 호출하는 람다식은 '메서드 참조'로 더 간단히 할 수 있다.

ClassName:: method 

 

생성자의 메서드 참조

Supplier<MyClass> s = () -> new MyClass(); // 람다식

Supplier<MyClass> s = MyClass::new //메서드참조

Function<Integer, MyClass> s = (i) -> new MyClass(i);

Function<Integer, MyClass> s = MyClass::new;

 

배열과 메서드 참조 

Function<Integer, int[]> f = x -> new int[x];

Function<Integer, int[]> f2 = int[]::new; 

 

Ch14 - 15, 16 [스트림, 스트림의 특징]

- 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것

- 스트림이 제공하는 기능 : 중간 연산과 최종 연산 

          중간연산: 연산결과가 스트림인 연산. 반복적으로 적용 가능

          최종연산: 연산결과가 스트림이 아닌 연산. 단 한번만 적용 가능 (스트림의 요소를 소모) 

 

스트림의 특징 

- 스트림은 데이터소스로부터 데잍를 읽기만 할 뿐 변경하지 않는다. 

- 스트림은 Iterator처럼 일회용이다. 

- 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산.

- 스트림은 작업을 내부 반복으로 처리한다.

- 스트림의 작업을 병렬로 처리 - 병렬스트림 

- 기본형 스트림 - IntStream, LongStream, DoublcStream

오토박싱&언박싱의 비효율이 제거됨 (Stream<Integer> 대신 IntStream 사용)

숫자와 관련된 유용한 메서드를 Stream<T> 보다 더 많이 제공 

Ch14 - 26~29 [스트림의 중간연산]

- 스트림 자르기 - skip(), limit() 

- 스트림의 요소 걸러내기 -filter(), distinct 

- 스트림 정렬하기 - sorted()

- Comparator의 comparing()으로 정렬기준을 제공 

- 추가 정렬 기준을 제공할 때는 thenComparing()을 사용

- 스트림의 요소 변환하기 - map() 

- 스트림의 요소를 소비하지 않고 엿보기 - peek() 

- 스트림의 스트림을 스트림으로 변환 - flatMap()

 

Ch14 - 35~39 [Optional]

Optional<T>

- T타입 객체의 래퍼클래스 - Optional <T> 

 

Optional<T> 객체 생성하기

- Null 대신 Optional<T>객체를 사용하자 

 

Optional<T>객체의 값 가져오기

- Optional객체의 값 가져오기 - get(), orElse(), orElseGet(), orElseThrow() 

- isPresent() - Optional객체의 값이 null이면 false , 아니면 true를 반환 

 

Ch14 - 40~44 [스트림의 최종연산]

- 스트림의 모든 요소에 지정된 작업을 수행 - forEach(), forEachOrdered() 

- 조건검사 - allMatch(), anyMatch(), noneMatch() 

- 조건에 일치하는 요소 찾기 - findFirst(), findAny()  

 

Reduce

- 스트림의 요소를 하나씩 줄여가며 누적연산 수행 - reduce() 

 

Ch14 - 45~49 [collect(), collectors]

- collect()는 Collector를 매개변수로 하는 스트림의 최종연산 

- Collector는 수집에 필요한 메서드를 정의해 놓은 인터페이스 

- Collectors클래스는 다양한 기능의 컬렉터를 제공 

 

스트림을 컬렉션, 배열로 변환

- 스트림을 컬렉션으로 변환 - toList(), toSet(), toMap(), toCollection() 

 

스트림의 통계 - counting(), summinglnt() 

- 스트렘의 통계정보 제공 

 

Ch14 - 50~55 [스트림의 그룹화와 분할]

스트림의 그룹화와 분할 

- partitioningBy()는 스트림을 2분할한다.

- gruopingBy()는 스트림을 n분할한다.