❓ 언제 UnaryOperator를 사용할까?
사실Function를 사용해도 된다. 하지만 input과 output이 동일한 형태라면UnaryOperator를 사용하면 좀 더 편리하다..!
UnaryOperator<T>는 Function<T, T> 인터페이스를 상속받고 있다.package java.util.function;
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
static <T> UnaryOperator<T> identity() {
return t -> t;
}
}
package com.learnJava.functionalInterfaces;
import java.util.function.UnaryOperator;
public class UnaryOperatorExample {
static UnaryOperator<String> unaryOperator = (s) -> s.concat(" Default");
public static void main(String[] args) {
System.out.println(unaryOperator.apply("java8"));
}
}
UnaryOperator를 사용하니 Function 때와 달리 UnaryOperator<String>처럼 제네릭에 String을 하나만 적어주면 된다...!UnaryOperator와 비슷한 맥락으로 BiFunction을 상속 받는다.minBy와 maxBy 가 추가되어 Comparator를 인자로 받아 2개의 값을 비교할 수 있다.package java.util.function;
import java.util.Objects;
import java.util.Comparator;
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
}
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
}
}
minBy와 maxBy를 사용하여 BinaryOperator 를 인스턴스화한다면 추상 메서드인 apply는 comparator를 사용하여 비교해 해당 값을 반환하는 apply로 구현된다.package com.learnJava.functionalInterfaces;
import java.util.Comparator;
import java.util.function.BinaryOperator;
public class BinaryOperatorExample {
static Comparator<Integer> comparator = (a, b) -> a.compareTo(b);
public static void main(String[] args) {
BinaryOperator<Integer> binaryOperator = (a, b) -> a * b;
System.out.println(binaryOperator.apply(3, 4));
// maxBy 예시
BinaryOperator<Integer> maxBy = BinaryOperator.maxBy(comparator);
System.out.println("Result of MaxBy is : " + maxBy.apply(4, 5));
// minBy 예시
BinaryOperator<Integer> minBy = BinaryOperator.minBy(comparator);
System.out.println("Result of MinBy is : " + minBy.apply(4, 5));
}
}
12
Result of MaxBy is : 5
Result of MinBy is : 4