-
자바는 구체적인 타입을 필요로하는 엄격한 언어이다.
그렇기에 java.util.function 패키지를 통해 40개 이상의 함수형 인터페이스를 제공한다.
각각 아래와 같이 존재한다.
1. Function - 인수를 받고 결과를 반환
2. consumer - 인수만 받고 결과를 반환하지 않음
3. Supplier - 인수를 받지 않고 결과만 반환
4. Predicate - 인수를 받아 표현식에서 테스트하고 boolean값 리턴
1. Function
가장 중요한 함수형 인터페이스 중 하나이다. 하나의 입력과 출력을 가진 전통적인 함수를 의미하며, 하나의 입력값을 받아 하나의 출력값을 내는 함수의 대표격이다.
T ---> [Function<T,R] ----->R
Function<T,R> 의 단일 추상 메서드는 apply로 T타입의 인수를 받아 R타입의 결과를 생성한다.
@FunctinalInterface public interface Function<T,R> { R apply(T t); }
다음은 문자열의 null체크 후 길이를 반환하는 코드이다.
Function <String, Integer> stringLength = str -> str != mull ? str.length(): 0; Integer result = stringLength.apply("Hello. Worl!"); //문장 마지막 d가 없어보이겠지만 무시해달라...ㅠ
2. Consumer
Consumer는 입력 파라미터를 소비하지만 아무것도 반환하지 않는다.
핵심인 java.util.function.Con-suner<T>는 아래와 같다.
T ----> [Consumer<T>]
Cunsumer<T>의 단일 추상 메서드는 accept로, T타입의 인수가 필요하다.
@functionalInterface public interface Consumer<T>{ void accept(T t); }
아래의 코드는 String을 소비(Consumer)하여 출력한다.
Consumer<String> println = str -> System.out.println(str); println.accept("Hello, Consumer!");
값의 소비만을 위한 순수한 소비(Consumer)형 함수에 부합하지 않겠지만, 어찌되었든 위와같이 동작하는 핵심이 중요한 것 같다.
3. Supplier
Supplier은 Consumer와 반대로, 함수형 인터페이스는 java.util.function.Supplier<T>타입을 기반으로 한다.
어떠한 입력값도 받지 않지만 T타입의 단일 반환값을 반환하다.
[Supplier<T>] ---> T
추상메서드는 get으로 정의된다.
@FunctionalInterface public interface Supplier<T> { T get(); }
다음 Supplier<Double>은 get()은 호출할 때마다 새로운 랜덤값을 출력한다.
Supplier<Double> random = () -> Math.random(); Double result = random.get();
Supplier는 종종 지연 실행에 사용된다.
예를들어 비용이 많이 들어가는 작업을 Supplier로 래필하고, 필요할때만 get을 호출하는 경우이다.
4. Predicate
Predicate는 단일 인수를 받아 그것을 로직에서 테스트하고, 그 결과에 따라 true, false값을 리턴하는 함수이다.
java.util.function.Predicate<T>구문은 아래와 같다.
T -----> [Predicate<T>] ----> boolean
Predicate<T>의 단일 추상 메서드는 test로, T타입의 인수를 받아 boolean타입을 반환한다.
@FunctionalInterface public interface Predicate<T> { boolean test(T t); }
Predicate는 필터(filter)와 같이 의사 결정에 주로 사용된다.
아래의 코드는 Integer가 9000을 초과하는지 '테스트'한다.
Predicate<Integer> over9000 = i -> i > 9_000; boolean result = over9000.test(12_345);
'Devloper > 자바JAVA' 카테고리의 다른 글
자바 - 람다(Lambda) 문법 & 메서드 참조(::) (0) 2025.01.31 자바 - 스트림(Stream) (0) 2025.01.23 자바 - 레코드(Record) (0) 2025.01.23 댓글