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>
로 대체할 수 있다.