Functional Interface
Functional Interface들은 java.util.function 패키지에 포함되어 있으며 람다 표현식이나 메소드 참조를 위한 target type을 제공한다. Functional Interface는 인터페이스이면서 내부에 추상 메소드를 한 개만 가진다. 해당 package 내에 많은 Functional interface가 존재하지만, 그 중에서도 중요한 4가지의 Functional interface에 대해서 알아보고자 한다. (Predicate, Function, Consumer, Supplier)
Predicate
Predicate는 인자를 받아서 true나 false를 리턴한다.
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t)
}
Example
문자열 s를 받아서 s의 길이가 5 이상인 경우 true, 아닌 경우 false를 리턴하도록 해보자.
Predicate<String> predicateFunc = s -> s.length() >= 5;
System.out.println(predicateFunc("abcdefg"));
System.out.println(predicateFunc("a"));
Output:
true
false
Typical Use case
Predicate 람다는 콜렉션의 값을 필터링 할 때 많이 사용된다.
A로 시작하는 문자열만 Collect
List<String> arr = Arrays.asList("A", "AB", "C");
List<String> arrWithA = arr.stream()
.filter(s -> s.startWith("A"))
.collect(Collectors.toList());
Function
Function은 하나의 인자를 받아 결과를 리턴한다.
예를 들어, 객체를 받아서 다른 객체로 변환하여 리턴할 수도 있다.
@FunctionalInterface
public interface Function<T, R>{
R apply(T t);
}
Example
Integer를 받아서 2를 곱한 값을 리턴하도록 해보자.
Function<Integer, Integer> functionFunc = i -> i*2;
System.out.println(functionFunc(10));
Output
20
Consumer
Consumer는 한 개의 인자를 받으며 return값이 없는 Functional Interface이다.
@FunctionalInterface
public interface Consumer<T>{
void accept(T t);
}
Example
List 내 forEach는 Consumer를 인자로 받는다.
default void forEach(Consumer<? super T> action) {
for (T t : this) {
action.accept(t);
}
}
List<String> names = Arrays.asList("Goeun", "Juhee", "Minyoung");
names.forEach(name -> System.out.println("Hello, " + name));
Output
Hello, Goeun
Hello, Juhee
Hello, Minyoung
Supplier
Consumer와 정 반대의 역할을 한다. 인자를 받지 않지만 특정 값을 리턴한다.
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Example
Supplier<Integer> supplierFunc = () -> 25;
System.out.println(supplierFunc.get());
Output
25
참고
https://javagyansite.com/2018/12/27/functional-interfaces-predicate-consumer-function-and-supplier/
https://www.baeldung.com/java-8-functional-interfaces
'💻IT > Java' 카테고리의 다른 글
[Java] Java 8 Method Reference (메소드 참조) (0) | 2021.12.12 |
---|---|
[Java] Java 8 Optional (0) | 2021.12.09 |
[Java] Java 8 Stream API (0) | 2021.12.03 |
[Java] Deque 자료 구조 (LinkedList 메소드) (0) | 2021.11.15 |
[Java] Convert Array to List / Convert List to Array (0) | 2021.10.18 |