Functional Interface란?
Java8부터 함수형 패러다임을 적용하기 위해 적용된 기능으로 Lamda Expression 또는 method reference를 이용하여 구현됩니다.
Lamda Expression이란?
람다 표현식은 익명 함수
를 보다 간결하고 가독성있게 표현하는 문법입니다. 기본적으로 아래와 같은 형태로 사용합니다.(매개 변수 목록) -> (실행문)
Method Referece란?
메서드 참조란 람다 표현식을 더욱 간결하고 가독성있도록 표현하는 문법입니다. 아래와 같은 방법으로 사용할 수 있습니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// Lambda expression 사용
names.forEach(name -> System.out.println(name));
// Method Reference 사용
names.forEach(System.out::println);
Function
Function 인터페이스 중 하나인 Function
에 대해 살펴보겠습니다.
기본적인 형태는 다음과 같습니다.
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
위에서 제너릭 T 타입의 매게 변수 하나를 받아 제너릭 R 타입 하나를 리턴합니다. 아래와 같은 방법으로 사용할 수 있습니다.
Function<Integer, Integer> square = x -> x * x;
Function<Integer, Integer> add = x -> x + 2;
int result = square.andThen(add).apply(5); // 결과: 27
andThen() 메서드를 통해 함수를 연속해서 사용할 수 있습니다.
Function 인터페이스를 사용하는 예시로는 Optional
클래스의 map
을 보겠습니다.
public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent()) {
return empty();
} else {
return Optional.ofNullable(mapper.apply(value));
}
}
Function 익명함수인 mapper를 매개 변수로 받아, Optional의 value가 있을 경우에 apply 메서드를 mapper를 실행한 리턴값을 리턴하고 있습니다.
Supplier
Supplier
는 Funciotn
과 다르게 매개변수를 받지 않고 리턴만 합니다. Supplier
인터페이스는 다음과 같습니다
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Supplier를 적용한 예시는 Optional의 or
메서드가 있습니다.
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
Optional의 value가 null일 경우 supplier 객체를 실행한 리턴값을 반환합니다.
Consumer
Consumer
는 매개변수를 받지만 리턴 값이 없는 인터페이스로 아래와 같습니다.
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
// ...
}
Optional의 ifPresent
메서드가 이 인터페이스 객체를 인자로 가집니다.
public void ifPresent(Consumer<? super T> action) {
if (value != null) {
action.accept(value);
}
}
지금까지 Functional Interface에 대해서 알아봤습니다. 그냥 사용하고 있었는데, 종류와 특징에 대해 알게되는 좋은 기회였습니다.
'Back-end > Java' 카테고리의 다른 글
[JAVA] 불필요한 객채 생성을 막자. 싱글톤 패턴과 정적 초기화 블럭 (0) | 2022.07.09 |
---|---|
[JAVA] 내부 클래스 간단 정리와 사용 이유 (0) | 2022.07.08 |
[Java 에러] Get 통신에서 JsonProperty가 동작하지 않을 때 (0) | 2022.06.30 |