Stream.collect() - Collectors

1 분 소요

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(" "));  
}
  1. List에 있는 길이가 2 이상인 경우를 먼저 찾기 위해 filter로 길이가 1보다 큰 것을 걸러낸다.
  2. 그리고 걸러낸 길이가 2 이상인 문자열을 대상으로 map하여 대문자로 만들고 앞에 1자리만 잘라낸다.
  3. 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의 메서드

  1. toList(): 스트림의 요소를 List로 수집.
    List<T> list = stream.collect(Collectors.toList());
    
  2. toSet(): 스트림의 요소를 Set으로 수집.
    Set<T> set = stream.collect(Collectors.toSet());
    
  3. toMap(keyMapper, valueMapper): 요소를 특정한 키와 값 변환 함수를 사용하여 Map으로 수집.
    Map<K, V> map = stream.collect(Collectors.toMap(keyMapper, valueMapper));
    
  4. joining(): 요소를 하나의 문자열로 연결. 구분자 및 접두사 및 접미사를 지정.
    String result = stream.map(Object::toString)
     .collect(Collectors.joining(", ", "[", "]")); // 하나만 쓸 시 구분자만 입력.
    
  5. groupingBy(classifier): 요소를 분류 함수(classifier)를 기반으로 그룹화하여 Map으로 수집.
    Map<K, List<T>> groups = stream.collect(Collectors.groupingBy(classifier));
    
  6. partitioningBy(predicate): 조건을 기반으로 요소를 truefalse 그룹으로 분할하여 수집.
    Map<Boolean, List<T>> partitions = stream.collect(Collectors.partitioningBy(predicate));
    
  7. counting(): 스트림 내 요소의 수를 계산.
    long count = stream.collect(Collectors.counting());
    
  8. summingInt()/summingLong()/summingDouble(): 스트림 요소의 합계를 계산.
    int sum = stream.collect(Collectors.summingInt(Integer::intValue));
    
  9. averagingInt()/averagingLong()/averagingDouble(): 스트림 요소의 평균을 계산.
    double average = stream.collect(Collectors.averagingInt(Integer::intValue));
    
  10. maxBy(comparator)minBy(comparator): 제공된 비교자를 기반으로 스트림에서 최대 또는 최소 요소를 찾음.
    Optional<T> max = stream.collect(Collectors.maxBy(comparator)); 
    Optional<T> min = stream.collect(Collectors.minBy(comparator));
    

이러한 Collectors 메서드를 사용하여 Java Streams를 활용하면 다양한 데이터 처리 작업을 간단하게 수행할 수 있다. 각 메서드는 특정 작업에 적합한 결과를 생성하며, collect 작업을 매우 효과적으로 수행할 수 있다.

댓글남기기