우테코에서 문자열 계산기 미션을 진행하던 도중
사칙연산을 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는 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);
|
BiFunction은 Function에 인자가 두개 있는 버전이다.
<인자, 인자, 자료형>으로 구성된다.
Predicate<T>
1
2
|
Predicate<Integer> predicate = num -> num == 777;
|
Predicate 단어를 찾아보니 단언하다, 단정하다.라는 뜻을 가지고있다.
단어의 뜻에 맞게 인자를 한 개 가지고 리턴 타입은 boolean으로 고정이다.
boolean값을 고정으로 리턴하기 때문에 메소드명도 test인 것 같다.
BiPredicate<T, U>
1
2
|
BiPredicate<String, Integer> biPredicate = (str, num) -> Integer.parseInt(str) == num;
|
Predicate와 마찬가지로 리턴타입은 boolean형으로 고정이지만
인자를 2개 가지는 버전이다.
UnaryOperator<T>
1
2
|
UnaryOperator<String> unaryOperator = (input) -> input + "안뇽";
|
UnaryOperator는 한글로 단항연산자라는 뜻에 걸맞게
인자와 리턴타입이 똑같다.
파라미터로 받은 하나의 타입이 인자의 타입과 리턴타입이 된다.
BinaryOperator<T>
1
2
|
BinaryOperator<Integer> binaryOperator = (num1, num2) -> num1 + num2;
int result5 = binaryOperator.apply(3, 7);
|
BinaryOperator는 이항 연산자이다.
인자를 두 개 받고 리턴을 하지만
타입 파라미터는 한개를 받는다.
받아온 타입 파라미터로
인자 2개와 리턴타입이 결정된다.
Comparator<T>
1
2
3
|
Comparator<Integer> comparator = (num1, num2) -> (num1 - num2) * -1;
Integer [] array = {3, 1, 9, 6};
|
정렬을 위해 자주 구현했던 Comparator 인터페이스이다.
비교를 해야하니 타입 파라미터 1개에 인자 2개와 리턴 타입까지 정해진다.
1회성으로 사용할 때는
클래스에 Comparator를 구현하는 방식보다
위에 코드처럼 하는 방식을 자주 사용해봐야겠다.
'Java' 카테고리의 다른 글
Factory Pattern(팩토리 패턴) (0) | 2020.02.24 |
---|---|
Iterator 인터페이스와 Iterable 인터페이스 (0) | 2020.02.17 |
추상 클래스와 인터페이스 (0) | 2020.02.10 |
Comparable, Comparator, 배열을 정렬하는 여러가지 방법 (0) | 2019.12.04 |
StringBuilder, StringBuffer, System.out.print, append (1) | 2019.07.11 |