1. 함수형 인터페이스는 java.util.fuction 표준 API 패키지로 제공하며 크게 5가지 종류가 있다.
: Consumer, Supplier, Function, Operator, Predicate
2. 매개타입으로 사용되어 람다식을 매개값으로 대입할 수 있도록 해준다.
각 인터페이스는 또 여러개의 인터페이스로 나뉜다
두개의 매개 변수를 받는 인터페이스라면 bi 라는 접두사, 정수 타입을 매개변수로 전달받는 인터페이스라면 int 라는 접두사가 혹은 실수 타입을 반환하는 인터페이스라면 AsDouble과 같은 접미사가 달려있는 등 일정한 네이밍 규칙이 존재한다.
Consumer 계열
: 매개 값은 있고, 반환 값은 없다. 매개 값을 전달받아 사용하고 아무것도 반환하지 않을 때 사용된다. 이를 소비 **(Consume)**한다고 표현한다. accept 추상 메소드를 가지고 있다.
예시
대표적으로 Stream의 forEach메소드의 매개변수 타입이 Consumer 다.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
numbers.stream().forEach(number -> System.out.println(number));
매개 값으로 number 를 받고 람다 표현식 내부에서 사용되기만 할 뿐 아무것도 반환하지 않는 것을 확인할 수 있다.
또한 Map의 ForEach메소드는 BiConsumer 타입을 매개변수로 받는다.
Map<String, Integer> map = Map.of("tei", 30, "baby", 1);
map.forEach((name, number) -> System.out.println(name + "는" + number + "살));
위와 같이 첫 번째 매개변수는 Map의 key 를, 두번째 매개변수는 Map 의 value 를 전달받는다.
Supplier 계열
매개값은 없고, 반환값은 있다. 실행 후 호출한 곳으로 데이터를 공급 (Supply) 한다.
getXXX 추상 메소드를 가지고 있다.
예시
Stream의 generate는 매개변수로 Supplier 타입을 받아 해당 get 메소드의 반환값으로 부한한 Stream을 생성한다.
Stream.generate(() -> "Infinite Stream!")
.limit(5)
.forEach(System.out::printlng);
Function 계열
매개 값도 있고, 리턴값도 있다. 주로 매개값을 반환값으로 매핑할 때 즉, 타입 변환이 목적일 때 사용한다. applyXXX 추상 메소드를 갖고 있다.
예시
IntStream 의 mapToObj 는 정수를 객체로 매핑하는 메소드이다. 이 메소드는 인자로 IntFunction 타입을 전달받는다.
List<Number> numbers = IntStream.rangeClosed(0, 10)
.mapToObj(number -> new Number(number))
.collect(Collectors.toList());
Operator 계열
Function 과 마찬가지로, 매개값도 있고, 반환값도 있다. 주로 매개값을 연산(Operation) 하여 결과를 반환할 대 사용된다. Function 과 마찬가지로 applyXXX 추상 메소드를 가지고 있다.
예시
Stream의 여러 오버로드 된 reduce 메소드 중 하나는 매개변수로 BinaryOperator를 전달받는다. 아래는 BinaryOperator를 활용하여 컬렉션의 모든 수를 더하는 예시이다.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
Integer sum = numbers.stream()
.reduce((acc, cur) -> acc + cur)
.get();
Predicate 계열
매개 값은 있고, 반환 타임은 boolean 이다. 매개값을 받아 검사하고true 혹은 false 를 반환할 떄 사용된다. test 추상 메소드를 가지고 있다.
예시
Stream 의 allMatch 메소드는 매개변수로 Predicate 타입을 전달받아, 컬렉션의 모든 요소가 주어진 조건에 모두 일치하면 true를 반환한다.
List<Integer> numbers = List.of(1, 2, 3 ,4, 5, 6);
boolean allMatched = nubmers.stream()
.allMatch(number -> nuber > 5);
자바 8 표준 API의 함수형 인터페이스 (Consumer, Supplier, Function, Operator, Predicate)
'Spring > Java,Spring' 카테고리의 다른 글
Session Storage Strategy (0) | 2023.09.20 |
---|---|
Lombok 이란? (0) | 2023.09.18 |
System.nanoTime & System.currentTimeMillis (feat. Intstant.now()) (0) | 2023.09.16 |
Oracle JDK & Open JDK (0) | 2023.09.15 |
[Spring Boot] Spring boot 버전에 맞는 Dependency 버전 찾기 (1) | 2021.10.11 |