Function<T,R>
T 타입을 받아서 R 타입을 리턴하는 함수 인터페이스
함수 조합용 메소드
BiFunction<T,U,R>
두 개의 타입(T,U)를 받아서 R 타입을 리턴하는 함수 인터페이스
Consumer<T>
T 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스
함수 조합용 메소드
Supplier<T>
T 타입의 값을 제공하는 함수 인터페이스
Predicate<T>
T 타입을 받아서 boolean을 리턴하는 함수 인터페이스
함수 조합용 메소드
UnaryOperator<T> : Function<T,R>의 특수한 형태로, 입력값 하나를 받아서 동일한 타입을 리턴하는 함수 인터페이스
BinaryOperator<T> : BiFunction<T,U,R>의 특수한 형태로, 동일한 타입의 입력값 두개를 받아 리턴하는 함수
public class Plus10 implements Function<Integer, Integer> {
@Override
public Integer apply(Integer integer) {
return integer + 10;
}
}
public class Plus {
public static void main(String[] args) {
Plus10 plus10 = new Plus10();
plus10.apply(1);
}
}
위와 같이 사용할 수 있고
public class Plus {
public static void main(String[] args) {
Function<Integer, Integer> plus10 = (i) -> i + 10;
plus10.apply(1);
}
}
위처럼 별도의 클래스를 만들지 않고 람다 형식으로 사용할 수 도 있다.
그리고 Function<T,R>의 compose() 함수를 쓰면 아래처럼 람다식을 서로 합칠 수 있는데
public class Plus {
public static void main(String[] args) {
Function<Integer, Integer> plus10 = (i) -> i + 10;
Function<Integer, Integer> multiply2 = (i) -> i* 2;
Function<Integer, Integer> multiply2AndPlus10 = plus10.compose(multiply2);
multiply2AndPlus10.apply(2);
}
}
두 람다식이 합쳐진 plus10.compose(multiply2) 함수는 변수 값에 X2 한다음 + 10해주는 함수다.
이와 반대로 AndThen() 함수는 compose()함수와는 반대로 10을 먼저 더해주고 그 다음에 X2해주는 함수다.
public class Plus {
public static void main(String[] args) {
Function<Integer, Integer> plus10 = (i) -> i + 10;
Function<Integer, Integer> multiply2 = (i) -> i* 2;
Function<Integer, Integer> multiply2AndPlus10 = plus10.compose(multiply2);
System.out.println("multiply2AndPlus10.apply(2) = " + multiply2AndPlus10.apply(2));
Function<Integer, Integer> plus10AndMultiply2 = plus10.andThen(multiply2);
System.out.println("plus10AndMultiply2.apply(2) = " + plus10AndMultiply2.apply(2));
}
}
public class Consume {
public static void main(String[] args) {
Consumer<String> printT = (s) -> System.out.println(s);
printT.accept("Hello");
}
}
public class Supply {
public static void main(String[] args) {
Supplier<Integer> get10 = () -> 10;
get10.get();
}
}
public class Predict {
public static void main(String[] args) {
Predicate<String> startsWithHyunSik = (s) -> s.startsWith("hyunsik");
Predicate<Integer> isOdd = (i) -> i % 2 == 1;
System.out.println("startsWithHyunSik.test(\"hyunsikYoon\") = " + startsWithHyunSik.test("hyunsikYoon"));
System.out.println("isOdd.test(4) = " + isOdd.test(4));
}
}
// Function<Integer, Integer> plus10 = (i) -> i + 10;
UnaryOperator<Integer> plus10 = (i) -> i + 10;
위와 같이 입력받은 타입과 리턴 타입이 같을 경우 UnaryOperator<T>로 대체 가능하다.