-
[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
'Java' 카테고리의 다른 글
☑️[JAVA] 배열을 정렬하는 다양한 방법(feat.sorted()) (0) 2022.12.02 [JAVA] 숫자를 문자로, 문자를 숫자로 형변환 (0) 2022.12.02 [JAVA] 숫자 Stream 조건걸고 만드는 여러가지 방법 (0) 2022.12.01 [JAVA] null 예외를 깔끔하게 해주는 Optional 클래스 (0) 2022.12.01 [JAVA] String 변수 값이 같은지 확인할 때는 equals()를 사용하자(쓰지마 ==) (0) 2022.11.23