본문 바로가기

Language/Java

[Java] 자바 람다식

< 자바스크립트 화살표 함수 >

람다식이라는 건 결국 자바스크립트의 화살표 함수처럼 익명함수를 쉽게 표현한 방식이다.

 

처음에는 그냥 사용하면 될지 알았는데 생각해보니 자바는 객체 타입을 미리 정해주지 않으면 안된다.

(자바스크립트 같은 경우는 calculator를 할당할 때 function이 된다.)

 

그렇기 때문에 함수라는 타입의 객체를 생성해주지 않으면 사용할 수 없다.

이것을 위해 FunctionalInterface 라는걸 사용한다.

 

< 추상형 메소드를 담은 인터페이스 > 
< 람다식 사용 >

Function이라는 추상 클래스를 생성하게 되면 무엇이 담길 지 정해져 있지 않으므로, Override하는 형식으로 함수를 변수에 담을 수 있기 때문에 이러한 방법을 사용하는 것 같다.

 

이 때, 인터페이스는 하나 이상의 메소드를 담을 수 없다고 한다.

그렇기 때문에 @FunctionalInterface 라는 어노테이션을 활용한다고 한다.

 

이러한 람다식은 Stream API에서 가장 잘 사용하고 있다.

예시를 들어서 확인해보자.

 

Stream.forEach

< foreach 사용법 >

Stream 객체는 Collection의 stream메소드를 통해 생성된다.

 

System.out에 ::은

메소드 레퍼런스라고 불리고, 람다식을 줄여쓸때 사용된다.

해당 코드는 i -> System.out.println(i) 을 줄여 쓰여진 것이다.

정해진 파라미터가 이미 정해져있기 때문에 가능한거지 않나 싶다.

 

두가지 모두 가,라,다,나,마 순으로 출력된다.

 

Stream.map

< map 사용법 >

map은 리스트의 인자들을 새로운 값으로 리턴한다.

두 가지 모두 9,16,4,25,1과 같이 기존 값의 제곱된 값이 출력된다.

 

Stream.filter

< filter 사용법 >

filter는 조건에 맞는 값들을 출력한다.

두 값 모두 20 190 54로 0이상인 수들의 2배인 값을 출력했다.

 

Stream.sorted && Stream.collect

<sorted, collect 사용법>

sorted는 스트림객체 값들을 정렬한다.

collect는 Stream객체를 Collection객체로 반환할 때 사용된다.

두 리스트 모두 [20, 190, 54]가 출력된다.

 

이 포스팅을 본 후 Stream을 응용한 정렬을 보면 좋을 것 같다.