본문 바로가기

# 02/Java

[윤성우 열혈자바] 30-3. 스트림의 최종 연산

반응형

sum(), count(), average(), min(), max()

OptionalDouble average()

   IntStream, LongStream, DoubleStream 메소드


[IntStream 메소드들]  long, double 대해서도 정의되어 있음

 int sum()

 long count()

 OptionalDouble average()

 OptionalInt min()

 OptionalInt max()


public static void main(String[] args) {

   int sum = IntStream.of(1, 3, 5, 7, 9)  

                      .sum();     //

   System.out.println("sum = " + sum);

   

   long cnt = IntStream.of(1, 3, 5, 7, 9)

                       .count();    // 개수

   System.out.println("count = " + cnt);

   

   IntStream.of(1, 3, 5, 7, 9)

            .average()     // 평균

            .ifPresent(av -> System.out.println("avg = " + av));

   

   IntStream.of(1, 3, 5, 7, 9)

            .min()     // 최소

            .ifPresent(mn -> System.out.println("min = " + mn));

 

   IntStream.of(1, 3, 5, 7, 9)

            .max()    // 최대

            .ifPresent(mx -> System.out.println("max = " + mx));

}









forEach


void forEach(Consumer<? super T> action) // Stream<T> 메소드


void forEach(IntConsumer action) // IntStream 메소드


void forEach(LongConsumer action) // LongStream 메소드


void forEach(DoubleConsumer action) // DoubleStream 메소드








allMatch, anyMatch, noneMatch


[Stream<T> 메소드들] IntStream, LongStream, DoubleStream에도 정의된 메소드들

boolean allMatch(Predicate<? super T> predicate)

   스트림의 데이터가 조건을 모두 만족하는가?

 

boolean anyMatch(Predicate<? super T> predicate)

   스트림의 데이터가 조건을 하나라도 만족하는가?

 

boolean noneMatch(Predicate<? super T> predicate)

   스트림의 데이터가 조건을 하나도 만족하지 않는가?



public static void main(String[] args) {

   boolean b = IntStream.of(1, 2, 3, 4, 5)

                        .allMatch(n -> n%2 == 0);

   System.out.println("모두 짝수이다. " + b);

 

   b = IntStream.of(1, 2, 3, 4, 5)

                .anyMatch(n -> n%2 == 0);

   System.out.println("짝수가 하나는 있다. " + b);

 

   b = IntStream.of(1, 2, 3, 4, 5)

                .noneMatch(n -> n%2 == 0);

   System.out.println("짝수가 하나도 없다. " + b);

}










collect: 스트림에 있는 데이터를 모아라!


[Stream<T> 메소드] IntStream, LongStream, DoubleStream에도 정의된 메소드

<R> R collect(Supplier<R> supplier,

              BiConsumer<R, ? super T> accumulator,

              BiConsumer<R, R> combiner)


public static void main(String[] args) {

   String[] words = {"Hello", "Box", "Robot", "Toy"};

   Stream<String> ss = Arrays.stream(words);

 

   List<String> ls = ss.filter(s -> s.length() < 5)

                       .collect(() -> new ArrayList<>(), // 저장소 생성

                                (c, s) -> c.add(s), //  번째 인자 통해 생성된 인스턴스 c, 스트림의 데이터 s

                                (lst1, lst2) -> lst1.addAll(lst2));   // 순차 스트림에서는 의미 없음

   System.out.println(ls);

}


그러나 병렬 스트림을 고려하여 병렬 스트림에 의미 있는 문장을 작성해야 

null 전달  예외 발생









병렬 스트림에서의 collect


class CollectParallelStringStream {

   public static void main(String[] args) {

      String[] words = {"Hello", "Box", "Robot", "Toy"};

      Stream<String> ss = Arrays.stream(words);

     

      List<String> ls = ss.parallel()

                          .filter(s -> s.length() < 5)

                          .collect(() -> new ArrayList<>(),

                                   (c, s) -> c.add(s),

                                   (lst1, lst2) -> lst1.addAll(lst2));

      System.out.println(ls);

}


But!

병렬 스트림 생성을 통한 성능의 향상은 실행 결과를 기반으로 평가해야 한다.




반응형