T 타입을 받아서 R 타입을 리턴하는 함수 인터페이스package com.example.demo;
import java.util.function.Function;
public class Plus10 implements Function<Integer, Integer>{
@Override
public Integer apply(Integer t) {
return t + 10;
}
}
package com.example.demo;
import java.util.function.Function;
public class Foo {
public static void main(String[] args) {
Function<Integer, Integer> plus10 = (i) -> i + 10;
System.out.println(plus10.appply(1));
}
}
compose()는 ()안의 연산을 먼저 실행 시킨 뒤, 해당 결과 값을 사용하는 메소드이다.package com.example.demo;
import java.util.function.Function;
public class Foo {
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));
}
}
위 코드를 실행시키는 경우 결과 값은 14가 나온다.
매개변수 i값으로 2를 받았고, compose 때문에 먼저 연산되는 multiply2가 i를 4로 만들었다.
이후 plus10 Function이 실행 되어 14가 리턴되는 것이다.
자바에서 함수형 프로그래밍
- 고차 함수(Higher-Order Function): 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
andThen()은 compose()와 달리 ()안의 연산을 나중에 실행 시킨 뒤, 해당 결과 값을 사용하는 메소드이다.package com.example.demo;
import java.util.function.Function;
public class Foo {
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.andthen(multiply2);
System.out.println(multiply2AndPlus10.apply(2));
}
}
위 코드를 실행시키는 경우에는 결과 값이 24가 된다.
매개변수 2가 plus10에서 먼저 실행되어 12가 되고, 해당값을 multiply2에서 사용하기 때문이다.
R apply(T t, U u)
T,U)를 받아서 R 타입을 리턴하는 함수 인터페이스void Accept(T t)
T 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스public class Foo{
public static void main(String[] args) {
Consumer<Integer> printT = (i) -> System.out.println(i);
printT.accept(10);
}
}
결과 값으로 10이 리턴된다.
함수 조합용 메소드로
andThen이 있다.
T get()
T 타입의 값을 제공하는 함수 인터페이스public class Foo{
public static void main(String[] args) {
Supplier<Integer> get10 = () -> 10;
System.out.println(get10.get());
}
}
결과 값으로 10이 리턴된다.
boolean test(T t)
T 타입을 받아서 boolean을 리턴하는 함수 인터페이스public class Foo{
public static void main(String[] args) {
Predicate<String> startsWithJoon = (s) -> s.startsWith("joon");
System.out.println(startsWithJoon.test("joon"));
}
}
결과 값으로 true가 리턴된다.
함수 조합용 메소드로
And,Or,Negate가 있다.
package com.example.demo;
import java.util.function.Predicate;
public class Foo{
public static void main(String[] args) {
Predicate<Integer> isOdd = (i) -> i%2!=0;
Predicate<Integer> isEven = (i) -> i%2==0;
System.out.println(isOdd.or(isEven).test(3));
}
}
위 코드는 결과 값으로 false가 리턴된다.
Function<T, R>의 특수한 형태로, 입력값 하나를 받아서 동일한 타입을 리턴하는 함수 인터페이스Function<Integer, Integer> 과 같이 입력 타입 두개가 동일한 경우 UnaryOperator< T>로 대체해서 쓸 수 있다.BiFunction<T, U, R>의 특수한 형태로, 동일한 타입의 입력값 두개를 받아 리턴하는 함수 인터페이스BiFunction<Integer, Integer, Integer>를 BinaryOperator<Integer>로 대체할 수 있다.