웹사이트 검색

Java Stream collect() 메서드 예제


Java Stream collect()는 스트림 요소에 대해 변경 가능한 축소 작업을 수행합니다. 이것은 터미널 작업입니다.

가변 감소 작업이란 무엇입니까?

변경 가능한 축소 작업은 스트림 요소를 처리한 다음 변경 가능한 결과 컨테이너에 누적합니다. 요소가 처리되면 결합 기능이 모든 결과 컨테이너를 병합하여 결과를 생성합니다.

Java Stream collect() 메서드 서명

Java Stream collect() 메서드에는 두 가지 변형이 있습니다.

  1. R 수집(공급업체 공급업체, BiConsumer 누산기,BiConsumer 결합기)
  2. R collect(수집기수집기)

Collector는 공급자, 누산기 및 결합자 개체에 대한 래퍼를 제공하는 인터페이스입니다. 두 번째 방법은 내장 수집기 구현을 제공하기 위해 수집기 클래스를 활용할 때 유용합니다. collect() 함수의 세 가지 매개변수는 다음과 같습니다.

  1. 공급자: 변경 가능한 새 결과 컨테이너를 생성하는 함수입니다. 병렬 실행의 경우 이 함수는 여러 번 호출될 수 있으며 매번 새로운 값을 반환해야 합니다.
  2. accumulator는 요소를 결과 컨테이너로 접어야 하는 상태 비저장 함수입니다.
  3. combiner는 두 개의 부분 결과 컨테이너를 수락하고 이를 병합하는 상태 비저장 함수이며 accumulator 함수와 호환되어야 합니다.

Stream collect() 메서드 예제

Stream.collect() 메서드의 몇 가지 예를 살펴보겠습니다.

1. 문자열 목록 연결

문자열 목록을 연결하여 새 문자열을 만들고 싶다고 가정해 보겠습니다. Stream collect() 함수를 사용하여 변경 가능한 축소 작업을 수행하고 목록 요소를 연결할 수 있습니다.

List<String> vowels = List.of("a", "e", "i", "o", "u");

// sequential stream - nothing to combine
StringBuilder result = vowels.stream().collect(StringBuilder::new, (x, y) -> x.append(y),
		(a, b) -> a.append(",").append(b));
System.out.println(result.toString());

// parallel stream - combiner is combining partial results
StringBuilder result1 = vowels.parallelStream().collect(StringBuilder::new, (x, y) -> x.append(y),
		(a, b) -> a.append(",").append(b));
System.out.println(result1.toString());

산출:

aeiou
a,e,i,o,u

  • 공급자 함수는 모든 호출에서 새 StringBuilder 개체를 반환합니다.
  • accumulator 함수는 목록 문자열 요소를 StringBuilder 인스턴스에 추가합니다.
  • combiner 함수는 StringBuilder 인스턴스를 병합합니다. 인스턴스는 쉼표로 서로 병합됩니다.
  • 첫 번째 경우에는 순차적인 요소 스트림이 있습니다. 따라서 하나씩 처리되며 StringBuilder 인스턴스는 하나만 있습니다. 컴바이너 기능은 사용하지 않습니다. 이것이 출력이 \aeiou인 이유입니다.
  • 두 번째 경우에는 문자열의 병렬 스트림이 있습니다. 따라서 요소는 병렬로 처리되며 결합자 함수에 의해 병합되는 StringBuilder의 여러 인스턴스가 있습니다. 따라서 생성된 출력은 \a,e,i,o,u입니다.
  • 스트림 소스가 Set과 같이 정렬되면 collect() 메서드는 호출할 때마다 다른 결과를 생성할 수 있습니다.

문자열 목록을 연결하려는 경우 메서드 참조를 사용하여 코드 크기를 줄일 수 있습니다.

String result2 = vowels.parallelStream()
		.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
		.toString();

2. 수집기 클래스를 사용하여 목록으로 수집() 스트리밍

Collectors 클래스는 Collector 인터페이스의 많은 유용한 구현을 제공합니다. 정수 목록을 필터링하여 짝수 정수만 선택하는 예를 살펴보겠습니다. Stream filter()는 중간 작업이며 스트림을 반환합니다. 따라서 이 스트림에서 목록을 생성하기 위해 collect() 함수를 사용할 것입니다.

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
		
List<Integer> evenNumbers = numbers.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers);  // [2, 4, 6]

Collectors.toList()는 입력 요소를 새 목록에 누적하는 수집기 구현을 반환합니다.

3. 세트로 수집() 스트리밍

Collectors.toSet()을 사용하여 스트림 요소를 새로운 집합으로 수집할 수 있습니다.

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);

Set<Integer> oddNumbers = numbers.parallelStream().filter(x -> x % 2 != 0).collect(Collectors.toSet());
System.out.println(oddNumbers); // [1, 3, 5]

3. 수집()을 지도로 스트리밍

Collectors.toMap() 함수를 사용하여 맵에 대한 스트림 요소를 수집할 수 있습니다. 이 메서드는 매핑 키에 대한 두 개의 인수와 Map의 해당 값을 허용합니다.

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);

Map<Integer, String> mapOddNumbers = numbers.parallelStream().filter(x -> x % 2 != 0)
		.collect(Collectors.toMap(Function.identity(), x -> String.valueOf(x)));
System.out.println(mapOddNumbers); // {1=1, 3=3, 5=5}

4. 수집가 Join() 예제

수집기 Join() 메서드를 사용하여 발생 순서에서 입력 스트림 CharSequence 요소를 연결하는 수집기를 가져올 수 있습니다. 이를 사용하여 문자열 스트림, StringBuffer 또는 StringBuilder를 연결할 수 있습니다.

jshell> String value = Stream.of("a", "b", "c").collect(Collectors.joining());
value ==> "abc"

jshell> String valueCSV = Stream.of("a", "b", "c").collect(Collectors.joining(","));
valueCSV ==> "a,b,c"

jshell> String valueCSVLikeArray = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));
valueCSVLikeArray ==> "{a,b,c}"

jshell> String valueObject = Stream.of("1", new StringBuffer("2"), new StringBuilder("3")).collect(Collectors.joining());
valueObject ==> "123"

산출:

결론

Java Stream collect()는 주로 스트림 요소를 컬렉션으로 수집하는 데 사용됩니다. 터미널 작업입니다. 병렬 스트림과 함께 사용할 때 동기화를 처리합니다. Collectors 클래스는 우리를 돕기 위해 많은 Collector 구현을 제공합니다.

참조

  • Stream collect() API 문서
  • 수집기 인터페이스
  • 수집자 API 문서