ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 어떤 Stream은 sum()을 쓰고 어떤 Stream은 sum()을 못쓰는 이유
    Java 2022. 12. 2. 12:11

    다른 스트림에서 .sum()을 썼었는데 왜 여기엔 .sum()이 없지?

    제목과 같은 상황이 발생했다. 어떻게 스트림을 만들었냐에 따라 메서드를 사용할 수 있는게 있고 없는 게 있는 것이다. 이것은 언젠간 꼭 정리해야 하는 개념이라 포스팅을 남겨놓는다.


    Stream은 여러 클래스에 내장메서드로 들어있다.

    1. 기본형 (Primitive Type) 특화 스트림(IntStream, LongStream, DoubleStream)

    int[] arr = new int[] {1,2,3,4,5,6,7,8,9,10};
    IntStream stream = Arrays.stream(arr);
    
    String[] arr2 = new String[] {"사과", "배", "바나나"};
    Stream stream2 = Arrays.stream(arr2);

    2. 컬렉션 스트림

    ArrayList<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    
    Stream streamList = integerList.stream(); // ArrayList 내장 메서드 중 stream이 있다.

    3. 스트림 클래스로 직접

    // 🔥 Stream 클래스에 of 내장메서드를 통해 '기본형 배열'과 'Collection 배열'을 다 담을 수 있다.
    // 1.
    int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    Stream stream1 =  Stream.of(arr);
    
    // 2.
    ArrayList<Integer> integerList = new ArrayList<>();
    integerList.add(1);
    integerList.add(2);
    integerList.add(3);
    Stream stream1 =  Stream.of(integerList);

     

    스트림을 만드는 방법은 여러가지가 있으니 전략적으로 잘 골라서 쓰면 될 것이다.

    하지만 문제가 있다.

    각각의 방식대로 만들어진 스트림의 내장메서드가 다른 것이다... 그 중에는 sum(), average()가 있다.

     

    sum(), average()

    기본형 특화 스트림(IntStream, LongStream, DoubleStream)에만 존재함. 다른 스트림에서 사용하고 싶을 경우엔 mapToInt, mapToLong, mapToDouble를 앞에 먼저 넣어서 기본형스트림으로 변환을 해주면 된다.

     


    연습 예제

    int[] 배열에 "홀수만 모아서" 총합 구하기

    int[] arr = new int[] {1,2,3,4,5,6,7,8,9,10};
    IntStream intStream = Arrays.stream(arr);
    int sum = intStream
            .filter((num)-> num % 2 == 1)
            .sum();
    System.out.println("sum : " + sum); // 25

    ArrayList<Integer> 배열에 홀수만 모아서 총합 구하기

    ArrayList<Integer> integerList = new ArrayList<>();
    for(int i=1; i<=10; i++){
        integerList.add(i);
    }
    
    int sum1 = integerList.stream()
            .mapToInt(x -> x)
            .filter((num) -> num % 2 == 1)
            .sum();
    System.out.println("sum1 : " + sum1);

    int[] 배열에 홀수만 모아서 평균 구하기

    int[] arr2 = new int[] {1,2,3,4,5,6,7,8,9,10};
    OptionalDouble average = Arrays.stream(arr2)
            .filter((num) -> num % 2 == 1)
            .average();
    System.out.println("3 : " + average);

    List<Integer> 배열에 홀수만 모아서 평균 구하기

    ArrayList<Integer> integerList2 = new ArrayList<>();
    for(int i=1; i<=10; i++){
        integerList.add(i);
    }
    integerList2.stream()
            .filter((num)-> num % 2 == 1)
            .mapToInt(x->x)
            .average();

    ArrayList<{String 이름, int 점수}> 배열에서 점수의 총합 값 구하기(reduce)

    ArrayList<Test> integerList3 = new ArrayList<>();
    integerList3.add(new Test("원준", 100));
    integerList3.add(new Test("형일", 10));
    integerList3.add(new Test("재원", 90));
    integerList3.add(new Test("유경", 80));
    
    int sum2 = integerList3.stream()
            .map((obj) -> obj.score)
            .mapToInt(x -> x)
            .sum();
    System.out.println(sum2);

    참고

    https://bcp0109.tistory.com/299

     

Designed by Tistory.