💻IT/Java

[Java] Java 8 Functional Interface

gom20 2021. 12. 10. 16:10

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