Stream.collect() - Collectors
private static List<String> WORDS = Arrays.asList("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea");
// List에 저장된 단어들 중에서 단어의 길이가 2 이상인 경우에만, 모든 단어를 대문자로 변환하여 스페이스로 구분한 하나의 문자열로 합한 결과를 반환하여라.
// ex) ["Hello", "a", "Island", "b"] -> “H I”
public String quiz2() {
return WORDS.stream()
.filter(string -> string.length() > 1)
.map(string -> string.toUpperCase().substring(0, 1))
.collect(Collectors.joining(" "));
}
- List에 있는 길이가 2 이상인 경우를 먼저 찾기 위해 filter로 길이가 1보다 큰 것을 걸러낸다.
- 그리고 걸러낸 길이가 2 이상인 문자열을 대상으로 map하여 대문자로 만들고 앞에 1자리만 잘라낸다.
- collect의 Collectors.joining을 사용하여 공백을 구분자로 하여 하나의 문자로 붙인다.
지금보니 map 메서드에서 대문자로 만들기 전에 substring으로 잘라낸 후 toUpperCase() 하는 것이 조금이나마 더 효율적일 것 같다. 아무튼 오늘은 stream에서 사용하는 collect 메서드에 대해서 알아볼 것이다.
collect
<R, A> R collect(Collector<? super T, A, R> collector)
T
: 스트림의 요소 타입A
: 중간 결과의 형식 (accumulator)R
: 최종 결과의 형식 (result)Collector<? super T, A, R>
: 요소를 수집하는 데 사용되는 컬렉터.Collector
인터페이스를 구현한 객체이며, 다양한 메서드를 사용하여 스트림 요소를 어떻게 collect할지 정의. Java Streams의collect
메서드는 스트림의 요소를 모아서 collect하는 데 사용된다. 이 메서드를 사용하면 스트림에서 처리한 요소를 새로운 컬렉션으로 변환하거나, 특정한 연산을 수행할 수 있다.
Collectors의 메서드
toList()
: 스트림의 요소를List
로 수집.List<T> list = stream.collect(Collectors.toList());
toSet()
: 스트림의 요소를Set
으로 수집.Set<T> set = stream.collect(Collectors.toSet());
toMap(keyMapper, valueMapper)
: 요소를 특정한 키와 값 변환 함수를 사용하여Map
으로 수집.Map<K, V> map = stream.collect(Collectors.toMap(keyMapper, valueMapper));
joining()
: 요소를 하나의 문자열로 연결. 구분자 및 접두사 및 접미사를 지정.String result = stream.map(Object::toString) .collect(Collectors.joining(", ", "[", "]")); // 하나만 쓸 시 구분자만 입력.
groupingBy(classifier)
: 요소를 분류 함수(classifier)를 기반으로 그룹화하여Map
으로 수집.Map<K, List<T>> groups = stream.collect(Collectors.groupingBy(classifier));
partitioningBy(predicate)
: 조건을 기반으로 요소를true
및false
그룹으로 분할하여 수집.Map<Boolean, List<T>> partitions = stream.collect(Collectors.partitioningBy(predicate));
counting()
: 스트림 내 요소의 수를 계산.long count = stream.collect(Collectors.counting());
summingInt()/summingLong()/summingDouble()
: 스트림 요소의 합계를 계산.int sum = stream.collect(Collectors.summingInt(Integer::intValue));
averagingInt()/averagingLong()/averagingDouble()
: 스트림 요소의 평균을 계산.double average = stream.collect(Collectors.averagingInt(Integer::intValue));
maxBy(comparator)
및minBy(comparator)
: 제공된 비교자를 기반으로 스트림에서 최대 또는 최소 요소를 찾음.Optional<T> max = stream.collect(Collectors.maxBy(comparator)); Optional<T> min = stream.collect(Collectors.minBy(comparator));
이러한 Collectors 메서드를 사용하여 Java Streams를 활용하면 다양한 데이터 처리 작업을 간단하게 수행할 수 있다. 각 메서드는 특정 작업에 적합한 결과를 생성하며, collect 작업을 매우 효과적으로 수행할 수 있다.
댓글남기기