본문 바로가기

Java

함수형 인터페이스 API 정리

우테코에서 문자열 계산기 미션을 진행하던 도중

 

사칙연산을 if문 없이

자바에서 제공하는 함수형 인터페이스를

사용해서 if문 없이 간단히 해결할 수 있었다.

 

1
2
3
4
5
6
7
PLUS("+", (num1, num2) -> num1 + num2),
MINUS("-", (num1, num2) -> num1 - num2),
MULTIPLICATION("*", (num1, num2) -> num1 * num2),
DIVISION("/", (num1, num2) -> num1 / num2);
 
private String operator;
private BiFunction<Double, Double, Double>  expression;
 

 

BiFunction<Double, Double, Double> expression 이

(num1, num2) -> num1 + num2 라는 람다식을 저장하고 있는 것이다.

 

이처럼 편리하고 가독성 좋은 함수형 인터페이스들을

다음에도 꼭 사용할 수 있도록, 자바에서 제공하는

함수형 인터페이스 API를 정리하고 기억하고자 한다.

 

 

Runnable

1
2
Runnable runnable = () -> System.out.println("void");
 

예전부터 존재하던 인터페이스로, 쓰레드를 공부할 때 많이 본 인터페이스.

인자가 없고 리턴 타입이 void이다.

 

 

Supplier<T>

1
2
Supplier<Integer> supplier  = () -> 777;
int result = supplier.get();
 

 Supplier는 인터페이스 이름 자체의 뜻처럼 공급자이다.

인자가 없고 리턴타입만 존재한다. 항상 같은 값만 공급한다.

그래서 메소드명이 get인 것 같다.

랜덤 함수를 쓰는 경우에는 다른 값이 나올 수 있다.

 

Consumer<T>

1
2
Consumer<String> consumer = input -> System.out.println(input);
consumer.accept("parameters");
 

 Consumer또한 이름 자체의 뜻처럼 소비자이다.

Supplier과 반대로 리턴타입이 없고 인자만 존재한다.

인자를 받아서 어떤 것을 리턴하지 않고 그대로 소비한다.

뭔가 변경시키지 않고 그대로 소비하므로 메소드명이 accept이지 않을까 생각한다. 

 

BiConsumer<T, U>

1
2
BiConsumer<String, Integer> biConsumer = (str, num) -> System.out.println(str + num);
biConsumer.accept("숫자3"3);
 

BiConsumer는 Bi + Consumer로 이해하면 편하다.

Bi라는 접두사가 붙으면 인자를 두개 받는다고 생각하면 된다.

그냥 Consumer는 인자를 한 개 받아서 소비하지만

BiConsumer는 인자를 두 개 받아서 소비한다.

 

Function<T, R>

1
2
Function<String, Integer> function = input -> Integer.parseInt(input);
int result2 = function.apply("777");
 

Function은 전형적인 함수를 지원한다.

하나의 인자와 하나의 리턴 타입을 가진다.

 

BiFunction<T, U, R>

1
2
BiFunction<Integer, Integer, String> biFunction = (num1, num2) -> String.valueOf(num1 + num2);
String result7 = biFunction.apply(35);
 

BiFunction은 Function에 인자가 두개 있는 버전이다.

<인자, 인자, 자료형>으로 구성된다.

 

Predicate<T> 

1
2
Predicate<Integer> predicate = num -> num == 777;
boolean result3 = predicate.test(777);
 

 Predicate 단어를 찾아보니 단언하다, 단정하다.라는 뜻을 가지고있다.

단어의 뜻에 맞게 인자를 한 개 가지고 리턴 타입은 boolean으로 고정이다.

boolean값을 고정으로 리턴하기 때문에 메소드명도 test인 것 같다.

 

BiPredicate<T, U>

1
2
BiPredicate<String, Integer> biPredicate = (str, num) -> Integer.parseInt(str) == num;
boolean result6 = biPredicate.test("3"3);
 

Predicate와 마찬가지로 리턴타입은 boolean형으로 고정이지만

인자를 2개 가지는 버전이다.

 

UnaryOperator<T>

1
2
UnaryOperator<String> unaryOperator = (input) -> input + "안뇽";
String result4 = unaryOperator.apply("안녕??");
 

UnaryOperator는 한글로 단항연산자라는 뜻에 걸맞게

인자와 리턴타입이 똑같다.

파라미터로 받은 하나의 타입이 인자의 타입과 리턴타입이 된다.

 

BinaryOperator<T> 

1
2
BinaryOperator<Integer> binaryOperator = (num1, num2) -> num1 + num2;
 

 BinaryOperator는 이항 연산자이다.

인자를 두 개 받고 리턴을 하지만

타입 파라미터는 한개를 받는다.

받아온 타입 파라미터로

인자 2개와 리턴타입이 결정된다.

 

Comparator<T> 

1
2
3
Comparator<Integer> comparator = (num1, num2) -> (num1 - num2) * -1;
Integer [] array = {3196};
 

정렬을 위해 자주 구현했던 Comparator 인터페이스이다.

비교를 해야하니 타입 파라미터 1개에 인자 2개와 리턴 타입까지 정해진다.

 

1회성으로 사용할 때는

클래스에 Comparator를 구현하는 방식보다

위에 코드처럼 하는 방식을 자주 사용해봐야겠다.

 

참고문서