참고1. 함수형 인터페이스 알아보기 (Functional Interface) 이론편 [ 자바 (Java) 기초 ], 어라운드 허브 스튜디오https://www.youtube.com/watch?v=nKBd1fU1cxM
함수형 인터페이스 (= Functional Interface)
- 1개의 추상 메서드를 갖는 인터페이스를 말한다. 추상 메서드가 2개면, 함수형 인터페이스가 아니다.
- 람다 표현식(Lambda expression)과 함께 사용 가능하다. ➡️ 코드가 간단 명료해짐.
- Java 8 이후부터 Default Method를 사용할 수 있다.
@FunctionalInterface
컴파일 시, 함수형 인터페이스의 요구 사항을 만족하는 지 검증해주는 애너테이션
예시
함수형 인터페이스 Runnable
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface {@code Runnable} is used
* to create a thread, starting the thread causes the object's
* {@code run} method to be called in that separately executing
* thread.
* <p>
* The general contract of the method {@code run} is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
위의 함수형 인터페이스인 Runnable을 구현.
//1. Lambda Expression
Runnable runnable = () -> {
logic();
};
//2. 단순 Override
Runnable runnable = new Runnable() {
@Override
public void run() {
logic();
}
};
대표적인 종류
Function<T, R>
- T 타입의 인자를 입력받아, R타입을 리턴.
//1. Override
Function function = new Function() {
@Override
public Object apply(Object o) {
return null;
}
};
//2. Lambda
Function function1 = (o) -> {
return null;
};
//3. apply()
Object apply = function.apply(123);
Consumer<T>
- 인자는 하나 받고, 리턴 값은 없는 함수형 인터페이스.
- 주로 컬렉션의 foreach와 조합하여 사용.
1. Override
Consumer consumer = new Consumer() {
@Override
public void accept(Object o) {
System.out.println("Consumer Logic");
}
};
2. Lambda Expression
Consumer consumer = (o) -> {
System.out.println("Consumer Logic");
};
3. accept
consumer.accept(obj)
4. foreach와 조합
List<String> alpabets = Arrays.asList("A", "B", "C");
alpabets.forEach(consumer);
Supplier<T>
- 인자를 받지 않고, T타입의 객체를 리턴하는 함수형 인터페이스.
- Optional 객체의 함수들(or, orElseGet 등)과 조합하여 사용
//1. Override
Supplier supplier = new Supplier() {
@Override
public Object get() {
return new String();
}
};
//2. Lambda
Supplier supplier = () -> {
return new String();
};
//3. get()
Object o = supplier.get();
//4. Optional과 조합
Optional optional = Optional.empty();
optional.or(supplier);
optional.orElseGet(supplier);
Predicate<T>
- 인자를 받아 Boolean 타입을 리턴하는 함수형 인터페이스.
- 주로 filter와 조합하여 사용.
- 필터링, 조건부 로직 실행 시 활용.
//1. Lambda expression
Predicate<Integer> predicate = (integer) -> integer.equals(10);
//2. Override
Predicate predicate = new Predicate() {
@Override
public boolean test(Object o) {
return o.equals(10);
}
};
//3. test()
predicate.test(10)
//4. foreach와 조합
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 10);
alpabets.stream().filter(predicate);