1. 요소 수집

Stream마지막으로 클래스 에서 가장 흥미로운 메서드인 메서드에 도달했습니다 collect(). 스트림에서 친숙한 컬렉션( List<T>, 등) 으로 이동하는 Set<T>데 사용됩니다.Map<T, R>

collect()메서드는 특수 collector개체를 인수로 사용합니다. 이 개체는 스트림에서 모든 데이터를 읽고 특정 종류의 컬렉션으로 변환한 다음 반환합니다. 그런 다음 수집 메서드 자체가 이 컬렉션을 반환합니다.

이 모든 작업은 다소 매끄러운 방식으로 수행됩니다. collector객체의 유형은 입니다 Collector<T, A, R>. 보시다시피 세 가지 유형 매개변수가 있습니다. 마지막 유형 매개변수( R)는 일반적으로 와 같은 유형입니다 List<T>. 이는 컴파일러가 이 유형을 사용하여 메서드 자체에 대한 올바른 반환 유형을 결정할 수 있음을 의미합니다 collect().

너무 헷갈리지 않으셨으면 합니다. 어쨌든 Collector 개체를 직접 만들 필요는 없습니다. 클래스 의 정적 메서드가 반환하는 기성품이면 Collectors충분합니다.

수집가 클래스

Collectors클래스에는 이미 만들어진 수집기 개체를 반환하는 여러 가지 정적 메서드가 있습니다. 여기서 우리는 가장 중요한 것들을 고려할 것입니다.

toList()
스트림을 리스트로 변환하는 객체( List<T>)
toSet()
스트림을 집합으로 변환하는 객체( Set<T>)
toMap()
Map<K, V>스트림을 맵( ) 으로 변환하는 객체
joining()
스트림의 요소를 단일 문자열로 연결
mapping()
문자열의 요소를Map<K, V>
groupingBy()
요소를 그룹화하고 반환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(", ") );