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분할한다.
'공부 > JAVA' 카테고리의 다른 글
다형성 / 참조변수의 형변환 / Instance of 연산자 / 매개변수의 다형성 (0) | 2024.03.27 |
---|---|
[jsp, servlet] Part 2 (6) (1) | 2023.10.28 |
231025 자바의정석 (쓰레드) (2) | 2023.10.25 |
231024 자바의정석 (애너테이션 타입 정의, 요소) (0) | 2023.10.24 |
1023 공부 (0) | 2023.10.23 |