본문 바로가기

카테고리 없음

[Java] Functional Interface

참고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);