람다식
: 메서드를 하나의 '식(expression)'으로 표현한 것.
람다식은 함수를 간략하면서도 명확하게 표현할 수 있게 해준다.
'익명함수'라고도 한다.
람다식 작성하기
람다식은 익명 클래스의 객체와 동등하다.
타입 f = (int a, int b) -> a > b ? a : b; //참조변수의 타입을 뭘로 해야 할까?
익명 객체의 주소를 f 라는 참조변수에 저장.
참조형이니까 클래스 또는 인터페이스가 가능하다.
그리고 람다식과 동등한 메서드가 정의되어 있는 것이어야 한다.
그래야 참조변수로 익명 객체의 메서드를 호출할 수 있기 때문이다.
556p 참고
컬렉션 프레임웍과 함수형 인터페이스
메서드 참조
하나의 메서드만 호출하는 람다식은
'클래스 이름 :: 메서드이름' 또는 '참조변수 :: 메서드이름' 으로 바꿀 수 있다.
스트림(stream)
- 스트림은 데이터 소스로 부터 데이터를 일기만할 뿐, 데이터를 변경하지 않는다.
- 스트림은 Iterator처럼 일회용이다.
- 최종 연산이 수행되어야 비로소 스트림의 중간 연산을 거쳐 최종 연산에서 소모된다.
중간연산( distinct, sort)
- 병렬 처리가 쉽다. parallel()
스트림의 연산
: 연산은 중간연산과 최종연산으로 분류.
중간연산은 연산결과를 스트림으로 반환하기 때문에 중간 연산을 연속해서 연결할 수 있다.
반면 최종 연산은 스트림의 요소를 소모하면서 연산을 수행하므로 단 한번만 연산이 가능하다.
String[] str = {"aaa","bbb","ccc"};
Stream<String> str1 = Stream.of(str);
Stream<String> distinct = str1.distinct();
Stream<String> sorted = distinct.sorted();
Stream<String> limit = sorted.limit(3);
long count = limit.count();
중간연산
skip(3) : 처음 3개의 요소를 건너뛴다.
limit(5) : 스트림의 요소를 5개로 제한한다.
filter() : 주어진 조건에 맞지 않는 요소를 걸러낸다.
distinct() : 중복된 요소들을 제거한다.
sorted() : 정렬.
comparing()
map() : 스트림의 요소에 저장된 값 중에서 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때 사용한다.
peek() : 연산과 연산 사이에 올바르게 처리되었는지 확인할 때 사용.
forEach와 달리 요소를 소모하지 않으므로 연산 사이에 여러번 끼워 넣어도 문제가 되지 않는다.
flatMap() : Stream <T[]> 을 Stream<T> 로 변환해야 할 때 사용.
Optional<T>
: 'T타입의 객체'를 감싸는 래퍼 클래스.
Optional타입의 객체에는 모든 타입의 객체를 담을 수 있다.
get() : 저장된 값 반환. 없으면 nullException.
orElse("abc") : 저장된 값 반환. 없으면 abc 반환.
orElseGet(람다식) : orElse 동일.
orElseThrow(람다식) : null이면 지정한 예외 발생.
isPresent() : 옵셔널객체의 값이 null이면 false, 있으면 true.
ifPresent(람다식) : 있으면 람다식 실행, 없으면 아무일도 하지 않음.
최종연산
: 스트림의 요소를 소모하여 결과를 만들어낸다.
forEach() : 스트림의 요소 출력.
xxxMatch() : 조건검사 boolean타입 반환
findFirst() : 조건에 일치하는 첫 번째 요소 반환.
findAny() : 조건에 일치하는 요소를 하나 반환(병렬 스트림)
reduce() :
'Languages > JAVA' 카테고리의 다른 글
네트워킹 (0) | 2020.04.20 |
---|---|
입출력 I/O (0) | 2020.04.18 |
Java 쓰레드 (진행중) (0) | 2020.04.09 |
열거형(enum), 어노테이션 (0) | 2020.04.08 |
Java 제네릭스(Generics) (0) | 2020.04.08 |