티스토리 뷰

앞선 포스팅에서 함수형 인터페이스(Functional Interface)가 무엇인지 알아봤다. 이번 포스팅에서는 Java8에서 기본적으로 제공하는 함수형 인터페이스들을 알아보자. 보통 'API는 외울필요없다. 이런게 있다는것만 알고있으면 된다.' 이런말을 많이 하는데 개인적인 생각에 Java8에서 제공하는 API는 최대한 외울수 있는데까지는 외워야 한다고 생각한다. 다음번에 알아볼 Stream은 선언형 프로그래밍으로 API만 계속 등장하게되는데 그때마다 찾아서 쓰려면 오히려 생산성이 저하되는 일이 발생할 수도 있기때문이다.


1) Runnable

기존부터 존재하던 인터페이스로 스레드를 생성할때 주로사용하였으며 가장 기본적인 함수형 인터페이스다. void 타입의 인자없는 메서드를 갖고있다.

Runnable r = () -> System.out.println("hello functional");
r.run();


2) Supplier<T>

인자는 받지않으며 리턴타입만 존재하는 메서드를 갖고있다. 순수함수에서 결과를 바꾸는건 오직 인풋(input) 뿐이다. 그런데 인풋이 없다는건 내부에서 랜덤함수같은것을 쓰는게 아닌이상 항상 같은 것을 리턴하는 메서드라는걸 알 수 있다.

Supplier<String> s = () -> "hello supplier";
String result = s.get();


3) Consumer<T>

리턴을 하지않고(void), 인자를 받는 메서드를 갖고있다. 인자를 받아 소모한다는 뜻으로 인터페이스 명칭을 이해하면 될듯 하다.

Consumer<String> c = str -> System.out.println(str);
c.accept("hello consumer");


4) Function<T, R>

인터페이스 명칭에서부터 알 수 있듯이 전형적인 함수를 지원한다고 보면 된다. 하나의 인자와 리턴타입을 가지며 그걸 제네릭으로 지정해줄수있다. 그래서 타입파라미터(Type Parameter)가 2개다.

Function<String, Integer> f = str -> Integer.parseInt(str);
Integer result = f.apply("1");


5) Predicate<T>

하나의 인자와 리턴타입을 가진다. Function과 비슷해보이지만 리턴타입을 지정하는 타입파라미터가 안보인다. 반환타입은 boolean 타입으로 고정되어있다. Function<T, Boolean>형태라고 보면된다.

Predicate<String> p = str -> str.isEmpty();
boolean result = p.test("hello");


6) UnaryOperator<T>

하나의 인자와 리턴타입을 가진다. 그런데 제네릭의 타입파라미터가 1개인걸 보면 감이 오는가? 인자와 리턴타입의 타입이 같아야한다.

UnaryOperator<String> u = str -> str + " operator";
String result = u.apply("hello unary");


7) BinaryOperator<T>

동일한 타입의 인자 2개와 인자와 같은 타입의 리턴타입을 가진다.

BinaryOperator<String> b = (str1, str2) -> str1 + " " + str2;
String result = b.apply("hello", "binary");


8) BiPredicate<T, U>

서로 다른 타입의 2개의 인자를 받아 boolean 타입으로 반환한다.

BiPredicate<String, Integer> bp = (str, num) -> str.equals(Integer.toString(num));
boolean result = bp.test("1", 1);


9) BiConsumer<T, U>

서로 다른 타입의 2개의 인자를 받아 소모(void)한다.

BiConsumer<String, Integer> bc = (str, num) -> System.out.println(str + " :: " + num);
bc.accept("숫자", 5);


10) BiFunction<T, U, R>

서로 다른 타입의 2개의 인자를 받아 또 다른 타입으로 반환한다.

BiFunction<Integer, String, String> bf = (num, str) -> String.valueOf(num) + str;
String result = bf.apply(5, "678");


11) Comparator<T>

자바의 전통적인 인터페이스 중 하나이다. 객체간 우선순위를 비교할때 사용하는 인터페이스인데 전통적으로 1회성 구현을 많이 하는 인터페이스이다. 람다의 등장으로 Comparator의 구현이 매우 간결해져 Comparable 인터페이스의 실효성이 많이 떨어진듯 하다.

Comparator<String> c = (str1, str2) -> str1.compareTo(str2);
int result = c.compare("aaa", "bbb");


'Java' 카테고리의 다른 글

Java8#04. 스트림(Stream)  (3) 2016.10.19
Java8#03. 메서드 레퍼런스(Method Reference)  (2) 2016.10.17
Java8#02. 함수형 인터페이스(Functional Interface)  (5) 2016.10.17
Java8#01. 람다 표현식(Lambda Expression)  (19) 2016.10.02
자바8 용어정리  (1) 2016.09.19
Generic  (7) 2016.05.29
댓글
댓글쓰기 폼