Spring/Java,Spring

Java 8 표준 API의 함수형 인터페이스

Pazery는ENFJ 2023. 9. 17. 00:20
반응형
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)

[JAVA] 자바의 표준 함수형 인터페이스

반응형