ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 스트림(Stream)의 최종 연산 - 요소의 수집 : collect()
    Java/Stream 2022. 7. 29. 16:20
    반응형

    스트림(Stream)의 최종 연산 - 요소의 수집 : collect()

    1. collect()

    인수로 전달되는 Collectors 객체에 구현된 방법대로 스트림의 요소를 수집합니다. 또한, Collectors 클래스에는 미리 정의된 다양한 방법이 클래스 메소드로 정의되어 있습니다. 이 외에도 사용자가 직접 Collector 인터페이스를 구현하여 자신만의 수집 방법을 정의할 수도 있습니다.

    스트림 요소의 수집 용도별 사용할 수 있는 Collectors 메소드는 다음과 같습니다.
    1_1) 스트림을 배열이나 컬렉션으로 변환 : toArray(), toCollection(), toList(), toSet(), toMap()
    예제) 해당 스트림의 요소를 List 객체로 반환

    public static void createStreamToList() {
      Stream<String> stream = Stream.of(
          "Python", "Java", "JavaScript", "PHP", "SQL",
          "Python", "Java", "JavaScript", "PHP", "SQL"
      );
      List<String> strings = stream.collect(Collectors.toList());
      strings.forEach(System.out::println);
    }

    Console Output

     

    예제) 해당 스트림의 요소를 Set으로 반환

    public static void createStreamToSet() {
      Stream<String> stream = Stream.of(
          "Python", "Java", "JavaScript", "PHP", "SQL",
          "Python", "Java", "JavaScript", "PHP", "SQL"
      );
      Set<String> stringSet = stream.collect(Collectors.toSet());
      stringSet.forEach(System.out::println);
    }

    Console Output

     

    예제) 해당 스트림의 요소를 Map으로 반환

    public static void createStreamToMap() {
      Stream<Language> languageStream = Stream.of(
          new Language(1, "Python"),
          new Language(2, "Java"),
          new Language(3, "JavaScript"),
          new Language(4, "PHP"),
          new Language(5, "SQL")
      );
    
      Map<Integer, String> languageMap =
          languageStream.collect(Collectors.toMap(Language::getRank, Language::getLanguage));
    
      languageMap.entrySet().forEach(
          (entry) -> System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue())
      );
    }

    Console Output

     

    예제) 해당 스트림의 요소를 Map으로 반환 - 키가 중복될 때 새 값을 무시하고 이전 값을 유지

    public static void createStreamToMapDuplicateKey() {
      Stream<Language> languageStream = Stream.of(
          new Language(1, "Python"),
          new Language(2, "Java"),
          new Language(3, "JavaScript"),
          new Language(4, "PHP"),
          new Language(5, "SQL"),
          new Language(1, "Kotlin")
      );
    
      Map<Integer, String> languageMap =
          languageStream.collect(
              Collectors.toMap(Language::getRank, Language::getLanguage, (l1, l2) -> l1)
          );
    
      languageMap.entrySet().forEach(
          (entry) -> System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue())
      );
    }

    Console Output


    1_2) 요소의 통계와 연산 메소드와 같은 동작을 수행 : counting(), maxBy(), minBy(), summingInt(), averagingInt() 등
    예제) 해당 스트림에서 순위가 가장 높은(rank:1) 요소를 반환

    public static void createStreamToMinBy() {
      Stream<Language> languageStream = Stream.of(
          new Language(1, "Python"),
          new Language(2, "Java"),
          new Language(3, "JavaScript"),
          new Language(4, "PHP"),
          new Language(5, "SQL"),
          new Language(6, "Kotlin")
      );
      Optional<Language> opLanguage = languageStream.collect(
          Collectors.minBy((o1, o2) -> o1.getRank() - o2.getRank())
      );
      System.out.println(opLanguage.get().getLanguage());
    }
    
    static class Language {
    
      public Integer rank;
      public String language;
    
      Language(Integer rank, String language) {
        this.rank = rank;
        this.language = language;
      }
    
      public Integer getRank() {
        return rank;
      }
    
      public String getLanguage() {
        return language;
      }
    }

    Console Output

     


    1_3) 요소의 소모와 같은 동작을 수행 : reducing(), joining()
    예제) 해당 스트림의 요소를 ', '을 기준으로 합쳐서 문자열로 반환

    public static void createStreamToString() {
      Stream<String> stream = Stream.of("Python", "Java", "JavaScript", "PHP", "SQL");
      String result = stream.map(Object::toString).collect(Collectors.joining(", "));
      System.out.println("', '을 구분으로 합친 문자열 : " + result);
    }

    Console Output


    1_4) 요소의 그룹화와 분할 : groupingBy(), partitioningBy()

    예제) 해당 스트림의 요소의 글자 수에 따라 짝수와 홀수 리스트로 반환

    public static void createStreamToPartitioningBy() {
      Stream<String> stream = Stream.of("Python", "Java", "JavaScript", "PHP", "SQL");
      Map<Boolean, List<String>> patition = stream.collect(
          Collectors.partitioningBy(s -> (s.length() % 2) == 0));
      System.out.println("글자 수가 짝수인 요소 : " + patition.get(true));
      System.out.println("글자 수가 홀수인 요소 : " + patition.get(false));
    }

    Console Output

     

    소스 코드는 Github Repository 참조하세요.
    https://github.com/tychejin1218/blog/blob/main/stream/src/stream/Example09.java

    반응형

    댓글

Designed by Tistory.