람다식이라는 건 결국 자바스크립트의 화살표 함수처럼 익명함수를 쉽게 표현한 방식이다.
처음에는 그냥 사용하면 될지 알았는데 생각해보니 자바는 객체 타입을 미리 정해주지 않으면 안된다.
(자바스크립트 같은 경우는 calculator를 할당할 때 function이 된다.)
그렇기 때문에 함수라는 타입의 객체를 생성해주지 않으면 사용할 수 없다.
이것을 위해 FunctionalInterface 라는걸 사용한다.
Function이라는 추상 클래스를 생성하게 되면 무엇이 담길 지 정해져 있지 않으므로, Override하는 형식으로 함수를 변수에 담을 수 있기 때문에 이러한 방법을 사용하는 것 같다.
이 때, 인터페이스는 하나 이상의 메소드를 담을 수 없다고 한다.
그렇기 때문에 @FunctionalInterface 라는 어노테이션을 활용한다고 한다.
이러한 람다식은 Stream API에서 가장 잘 사용하고 있다.
예시를 들어서 확인해보자.
Stream.forEach
Stream 객체는 Collection의 stream메소드를 통해 생성된다.
System.out에 ::은
메소드 레퍼런스라고 불리고, 람다식을 줄여쓸때 사용된다.
해당 코드는 i -> System.out.println(i) 을 줄여 쓰여진 것이다.
정해진 파라미터가 이미 정해져있기 때문에 가능한거지 않나 싶다.
두가지 모두 가,라,다,나,마 순으로 출력된다.
Stream.map
map은 리스트의 인자들을 새로운 값으로 리턴한다.
두 가지 모두 9,16,4,25,1과 같이 기존 값의 제곱된 값이 출력된다.
Stream.filter
filter는 조건에 맞는 값들을 출력한다.
두 값 모두 20 190 54로 0이상인 수들의 2배인 값을 출력했다.
Stream.sorted && Stream.collect
sorted는 스트림객체 값들을 정렬한다.
collect는 Stream객체를 Collection객체로 반환할 때 사용된다.
두 리스트 모두 [20, 190, 54]가 출력된다.
이 포스팅을 본 후 Stream을 응용한 정렬을 보면 좋을 것 같다.
'Language > Java' 카테고리의 다른 글
[Java8] Strategy Pattern, FP, 1급 객체 (0) | 2019.04.14 |
---|---|
[Java]Collection 객체 응용(2) (0) | 2019.04.14 |
[Java]Comparable, Comparator (0) | 2019.04.14 |
[Java]Collection 객체 응용(1) (0) | 2019.04.12 |
[Java]모던 자바 ? Java8 Stream을 응용한 리스트 정렬 (0) | 2019.04.09 |