JDK1.8 부터 추가됨
메서드를 하나의 식으로 표현한 것
js의 화살표 함수 같은 느낌
메서드를 만들려면 클래스도 만들어야하는데 람다식은 바로 작성가능
메서드의 매개변수로 전달되어지는 것도 가능
int max(int a, int b) {
return a > b ? a : b;
}
(a, b) -> a > b ? a : b
메서드를 람다식으로 간략하게 작성가능
매개변수나 반환타입이 추론 가능한 경우 생략 가능
추상 메서드 하나만 가지는 인터페이스
람다식을 다루기 위한 인터페이스
인터페이스를 선언하고 람다식으로 초기화 하여 사용
람다식 앞에 인터페이스 타입으로 형변환 필요
함수형 인터페이스 사용할때 매번 새로 정의하는것 보다 이 패키지의 인터페이스를 활용하는 것이 좋다.
매개변수가 2개인 인터페이스
컬렉션 프레임웍의 함수형 인터페이스를 사용하는 디폴트 메서드
두 람다식을 합성하여 새로운 람다식을 만들 수 있다.
f.andThen(g) : f를 먼저 적용하고 g를 적용
f.compose(g) : g를 먼저 적용하고 f를 적용
Predicate를 and(), or(), negate()로 연결해서 하나의 새로운 Predicate로 결합할 수 있다.
람다식이 하나의 메서드만 호출하는 경우에는 메서드 참조라는 방법으로 람다식을 간략히 할 수 있다.
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
Function<String, Integer> f = Integer::parseInt;
데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓은 것
데이터 소스가 무엇이던 같은 방식으로 다룰 수 있음
코드의 재사용성이 높아짐
데이터 소스를 읽기만 하고 변경하지 않는다.
스트림은 한번 사용하면 닫혀서 다시 사용할 수 없다.
스트림은 작업을 내부 반복으로 처리하여 간결하다.
중간 연산 : 연산결과가 스트림인 연산, 이후 스트림에 추가적인 연산 가능
최종 연산 : 연산결과가 스트림이 아닌 연산, 이후 스트림에 추가적인 연산 불가
최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다.
스트림은 Stream< T> 라서 오토방식&언박싱으로 비효율이 발생한다.
Stream< Integer> 대신 IntStream을 사용하면 더 효율적이고, 유용한 메서드들이 더 포함되어 있다.
그런데 데이터 타입이 다양한 문제로 코드 재사용성 높이기 위해서 만든 것이 스트림인데 비효율때문에 다시 IntStream을 만드는 것이 이상하다.
스트림에 parallel() 메서드를 사용하면 연산을 병렬적으로 처리한다.
sequential()을 호출하면 취소할 수 있다.
java.nio.file.Files 는 파일 다루기에 유용한 메서드 제공
Files.list(dir) : 지정된 디렉토리에 있는 파일 목록을 소스로 하는 스트림 생성하여 리턴
Optional< T>은 지네릭 클래스로 T타입의 객체를 감싸는 래퍼 클래스이다.
모든 타입의 참조변수를 담을 수 있다.
최종 연산의 결과를 Optional 객체에 담아서 반환하면 그 결과가 null인지 매번 if문으로 체크하는 대신 메서드를 통해서 간단히 처리 가능
스트림의 요소를 수집하는 최종 연산
매개변수로 (Collector 인터페이스를 구현한것)Collector를 받는다
Collector를 구현한 방법대로 스트림의 요소를 수집한다.