상세 컨텐츠

본문 제목

자바 람다식 (Java Lambda Expression) - 중급편

프로그래밍/JAVA

by 라제폰 2019. 1. 4. 15:55

본문

*원문 : https://blog.naver.com/2feelus/220706354421


이번 글에서는 기본람다식을 기반으로 한 다양한 함수형 인터페이스에 대해 알아볼 것이다.


1. 기본적인 람다 인터페이스들

기존 포스트에서 확인한 기본적인 람다인터페이스들은 다음과 같다. 잠시 복습해보자.


java.util.function.Predicate<T>

임의의 타입 <T> 형태의 객체입력을 받아 그값을 처리한 후 결과가 true인지 false 인지를 리턴한다.

java.util.function.Function<T,R>

첫번째 임의의 형태<T>의 입력값을 받아 처리한후 두번째 임의의 형태<R>의 값으로 출력한다. 

java.util.function.Consumer<T>

임의형태의 입력값<T>을 받아 처리하고 출력은 하지 않는 형태의 인터페이스이다.

java.util.function.Supplier<R>

:입력값은 따로 없지만, 출력값<R>의 형태를 지정할수 있다.


2.  확장형 람다 인터페이스들

java.util.function 아래에는 위의 기본형 람다인터페이스외에 수많은 확장형 람다 인터페이스들이 존재한다. 몇가지만 확인해보자.


2.1 java.util.function.BiConsumer<T,U>

임의형태의 입력값<T>와 <U> 을 받고, 출력은 하지 않는 형태의 인터페이스이다.

예)

BiConsumer<String, String> biConsumer = (x, y) ->  System.out.println(x+","+y);

biConsumer.accept("First", "Second");


결과) First,Second




2.2 java.util.function.DoubleFunction

java.util.function.Function<T,R> 에서 확장한 람다식으로서,입력과 출력모두 double형태로 받는 람다식

예)

DoubleFunction doubleFunc = (a)-> a*0.1;

System.out.println("DoubleFunction test for a ="+ doubleFunc.apply(10));


결과) DoubleFunction test for a =1.0


2.3 java.util.function.LongToDoubleFunction

java.util.function.Function<T,R> 에서 확장한 람다식으로서,입력은 long로 받고 출력은 double형태로 리턴하는 람다식

예)

LongToDoubleFunction lToDLambda = a-> a;

System.out.println("LongToDoubleFunction test for a ="+ lToDLambda.applyAsDouble(10));


결과) LongToDoubleFunction test for a =10.0


2.4 java.util.function.ObjIntConsumer 

: 첫번째 파라미터는 객체(Object),두번째 파라미터는 int형을 받는 람다식의 선언

예)

java.util.function.ObjIntConsumer oIConsumer = (a,b) -> {System.out.println("Object a="+a+" b="+b);};

oIConsumer.accept("TestString", 100);


결과) Object a=TestString b=100


2.5 java.util.function.ToDoubleBiFunction<T,U>

: 첫번째 파라미터는 <T>형태, 두번째 파라미터는 <U>형태를 받아, 결과값으로는 double형태의 값을 리턴하는 람다식

예)

ToDoubleBiFunction<String,String> tdbLambda = (a,b)->a.length()+b.length();

System.out.println("ToDoubleBiFunction test ="+ tdbLambda.applyAsDouble("abc", "def"));

결과) ToDoubleBiFunction test =6.0


2.6 java.util.function.BinaryOperator<T>

: 같은 <T>형태의 두개의 파라미터를 받아서 람다식의 계산식대로 계산하고, 계산후의 결과값또한 <T>형태로 리턴하는 람다식

예)

BinaryOperator<String> binOp=(a,b)->a+","+b; 

System.out.println("BinaryOperator test for a and b="+ binOp.apply("Hello","World"));


결과) BinaryOperator test for a and b=Hello,World


2.7 java.util.function.UnaryOperator<T>

java.util.function.Function<T,R> 에서 확장한 람다식으로서, <T>형태의 입력값을 받아 <T>형태의 출력값을 리턴한다.

예)

java.util.function.UnaryOperator<String> uo = (x)->x.toUpperCase();

System.out.println("UnaryOperator test ="+ uo.apply("hello"));

결과) UnaryOperator test =HELLO



3. 맺으며 요약


위에서 처럼 람다식을 사용하기 위한 다양한 형태의 람다 인터페이스들이 준비되어있다. 요약하자면 다음과 같다.


1) bi~ 로 시작하는 두개의 각기 다른 형태의 파라미터를 위한 람다패턴(예-BiConsumer)

2) Double 혹은 Integer등의 primitive 형태의 입력과 리턴을 을 처리하기 위한 람다패턴 (예 - DoubleFunction)

3) 각기 다른 형태의 입출력 형태를 처리하기 위한 람다패턴 (예 - LongToDoubleFunction)

4) 두개의 각기 다른 형태의 입력 형태를 처리하기 위한 람다패턴 (예 - ObjIntConsumer)

5) 두개의 각기 다른 형태의 입력 형태를 처리해서, 특정형태로 리턴하기 위한 람다패턴 (예 - ToDoubleBiFunction)

6) 두개의 같은 형태의 입력을 처리해서, 입력형태와 같은 형태로 출력하기 위한 람다패턴 (예 - BinaryOperator)

7) 한개의 입력형태를 처리해서, 입력형태와 같은 형태로 출력하기 위한 람다패턴 (예 - UnaryOperator)


다른 함수형 언어에서는 이러한 람다식을 처리하기 위해 특별한 인터페이스 형태를 몰라도 되지만, 

자바에서는 입력값의 개수, 형태와 출력값의 형태에 따른 명확한 인터페이스의 이름을 알고 있어야 코드상에서 활용이 가능하다.

처음에는 어색하더라도 사용하다보면 명확한 입출력에 대한 정의가 매력으로 느껴질수도 있다.


다음글에서는 위에서 정의된 람다 인터페이스들을 활용해, JDK 8 에서 변화한 Collection및 추가된 Stream을 구현하는 방법을 알아볼 것이다.

관련글 더보기