ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • collect()와 Collectors
    JAVA/스트림 2023. 8. 9. 00:33

    두 가지 최종연산의 차이 - reduce()와 collect()

    reduce() : 전체에 대한 리듀싱

    collect() : 그룹별로 나눠서 리듀싱

     

     

    collect() : Collector를 매개변수로 하는 스트림의 최종연산

    Collector : 인터페이스

    Colltectors : 구현체

     

    Collector라는 인터페이스에 Collectors라는 클래스가 기능을 구현해서 그 기능들을 가져다가 사용하면 된다.

     

     

     

    스트림을 컬렉션으로 변환 - toList(), toSet(), toMap(), toCollection()

    List<String> names = stuStream.map(Student::getName)
                            .collect(Collectors.toList());
                            
    ArrayList<String> list = names.stream()
        .collect(Collectors.toCollection(ArrayList::new));
        // 새로운 ArrayList 만들어서 거기에 담는다.
        
    Map<String, Person> map = personStream
        .collect(Collectors.toMap(p -> p.getRegId(), p -> p));
                                 //       key     ,   value

    맨 위의 예제를 보면 toList를 통해 Stream<String>을 List<String>으로 변환해주었다.

    나머지도 같은 방식으로 변환이 된다.

    toMap에는 key와 value가 들어가야 하기 때문에 인자값으로 2개를 넣어줘야 한다.

     

     

     

     

    스트림을 배열로 변환 - toArray()

    Student[] stuNames = studentStream.toArray(Student[]::new); // 가능 (파라미터에 (i) -> new Student[i]도 가능)
    Student[] stuNames = studentStream.toArray(); // 에러
    Object[] stuNames = studentStream.toArray(); // 가능

    배열로 변환하려면 매개변수에 원하는 배열 타입을 넣어줘야한다. 그 타입이 반환 타입이랑 일치해야 한다.

    만약에 매개변수를 넣지 않는다면 반환 타입을 Object[]로 받아야 하지만 다시 형변환을 해야하기 때문에 맨 윗 줄을 가장 많이 사용한다고 한다.

     

     

     

     

    스트림의 통계정보 제공 - counting(), maxBy(), minBy()

    long count = stuStream.count();                 // 전체 카운트만 가능
    long count = stuStream.collect(counting());     // 그룹별로 카운트가 가능
    OptinalInt topScore = studentStream.mapToInt(Student::getScore).max();   // 전체의 max 값만 가능
    
    Optional<Student> topStudent = stuStream
                .collect(maxBy(Comparator.comparingInt(Student::getScore))); // 그룹에서의 max 값도 가능

     

     

     

     

    스트림을 리듀싱 - reducing()

    IntStream intStream = new Random().ints(1, 46).distinct().limit(6);
    
    OptionalInt       max = intStream.reduce(Integer::max); // 전체 리듀싱
    Optional<Integer> max = intStream.boxed().collect(reducing(Integer::max)); // 그룹별 리듀싱 가능

    리듀싱은 원래 있긴 하지만 collect의 reducing을 이용한다면 전체가 아니라 그룹별로 리듀싱도 가능하다.

    'JAVA > 스트림' 카테고리의 다른 글

    스트림의 그룹화와 분할  (0) 2023.08.09
    Optinal  (0) 2023.08.09
    스트림의 연산 - 최종 연산  (0) 2023.08.08
    스트림의 연산 - 중간 연산  (0) 2023.08.08
    스트림 만들기  (0) 2023.08.08
Designed by Tistory.