1. 요소 수집
Stream
마지막으로 클래스 에서 가장 흥미로운 메서드인 메서드에 도달했습니다 collect()
. 스트림에서 친숙한 컬렉션( List<T>
, 등) 으로 이동하는 Set<T>
데 사용됩니다.Map<T, R>
이 collect()
메서드는 특수 collector
개체를 인수로 사용합니다. 이 개체는 스트림에서 모든 데이터를 읽고 특정 종류의 컬렉션으로 변환한 다음 반환합니다. 그런 다음 수집 메서드 자체가 이 컬렉션을 반환합니다.
이 모든 작업은 다소 매끄러운 방식으로 수행됩니다. collector
객체의 유형은 입니다 Collector<T, A, R>
. 보시다시피 세 가지 유형 매개변수가 있습니다. 마지막 유형 매개변수( R
)는 일반적으로 와 같은 유형입니다 List<T>
. 이는 컴파일러가 이 유형을 사용하여 메서드 자체에 대한 올바른 반환 유형을 결정할 수 있음을 의미합니다 collect()
.
너무 헷갈리지 않으셨으면 합니다. 어쨌든 Collector 개체를 직접 만들 필요는 없습니다. 클래스 의 정적 메서드가 반환하는 기성품이면 Collectors
충분합니다.
수집가 클래스
이 Collectors
클래스에는 이미 만들어진 수집기 개체를 반환하는 여러 가지 정적 메서드가 있습니다. 여기서 우리는 가장 중요한 것들을 고려할 것입니다.
|
스트림을 리스트로 변환하는 객체( List<T> ) |
|
스트림을 집합으로 변환하는 객체( Set<T> ) |
|
Map<K, V> 스트림을 맵( ) 으로 변환하는 객체 |
|
스트림의 요소를 단일 문자열로 연결 |
|
문자열의 요소를Map<K, V> |
|
요소를 그룹화하고 반환Map<K, V> |
2. 스트림을 목록으로 변환
다음은 스트림으로 작업하고 결과를 목록으로 변환하는 일반적인 예입니다.
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
List<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toList() );
컬렉션에서 스트림을 얻었습니다. 그런 다음 첫 문자가 대문자인 문자열만 유지하여 새 스트림을 얻었습니다. 그런 다음 해당 스트림의 모든 데이터가 컬렉션으로 수집된 다음 반환됩니다.
3. 스트림을 집합으로 변환
다음은 스트림으로 작업하고 결과를 집합으로 변환하는 일반적인 예입니다.
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Set<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toSet() );
모든 것은 스트림을 로 변환하는 코드와 매우 유사하며 메서드 List
에서 반환하는 다른 수집기 개체만 사용합니다 toSet()
.
4. 스트림을 맵으로 변환
그러나 스트림을 맵으로 변환하는 것은 조금 더 어렵습니다. Map의 각 항목은 키와 값이라는 두 가지 요소로 구성됩니다. 스트림의 각 요소에 대한 키와 값을 정의하는 방법을 파악해야 합니다.
예:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
Map<String, String> result = list.stream()
.map( e -> e.split("=") )
.filter( e -> e.length == 2 )
.collect( Collectors.toMap(e -> e[0], e -> e[1]) );
여기서 무슨 일이 일어나고 있는지 살펴보겠습니다.
map(...)
첫 번째 줄에서 각 문자열을 문자열 배열로 변환하는 데 사용합니다 . split 메서드를 사용하여 각 문자열을 두 부분으로 나눕니다.
두 번째 줄에서는 filter()
정확히 두 개의 요소를 포함하는 배열만 메서드에 전달합니다. 문자열 d==3
은 필터와 일치하지 않는 세 가지 요소의 배열로 분할됩니다.
마지막으로 마지막 줄에서 스트림을 Map<String, String>
. 메서드 에 두 가지 함수가 전달됩니다 toMap()
. 스트림의 각 요소에 대해 첫 번째 함수는 키를 반환 하고 두 번째 함수는 값을 반환 해야 합니다 .
각 배열의 첫 번째 요소("a", "b", "c")는 키가 되고 각 배열의 두 번째 요소("2", "3", "4")는 값이 됩니다.
5. 스트림을 문자열로 변환
또 다른 흥미로운 컬렉터 객체는 에 의해 반환됩니다 Collectors.joining()
. 스트림의 모든 요소를 String
단일 문자열로 변환하고 연결합니다. 예
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );
GO TO FULL VERSION