-
스트림의 연산 - 최종 연산JAVA/스트림 2023. 8. 8. 23:21
1. 스트림의 모든 요소에 지정된 작업을 수행 - forEach(), forEachOrdered()
void forEach(Consumer<? super T> action) // 병렬 스트림인 경우 순서가 보장되지 않음
void forEachOrdered(Consumer<? super T> action) // 병렬 스트림일 때 순서 유지시켜줌직렬일 경우
IntStream.range(1, 10).sequential().forEach(System.out::print); // 정렬 됨 IntStream.range(1, 10).sequential().forEachOrdered(System.out::print); // 정렬 됨
병렬일 경우
IntStream.range(1, 10).parallel().forEach(System.out::print); // 정렬 안됨 IntStream.range(1, 10).parallel().forEachOrdered(System.out::print); // 정렬 됨
2. 조건 검사 - allMatch(), anyMatch(), noneMatch()
boolean allMatch(Predicate<? super T> predicate) // 모두 만족하는지
boolean anyMatch(Predicate<? super T> predicate) // 하나라도 만족하는지
boolean noneMatch(Predicate<? super T> predicate) // 모두 만족하지 않는지
boolean hasFailedStu = stuStream.anyMatch(s -> s.getScore() <= 100); // 불합격자가 있는지 확인
String[] strArr = { "Java", "Hello", "Hi" }; boolean noEmptyStr = Stream.of(strArr).noneMatch(s -> s.length() == 0) // true 반환
문자의 길이가 0인것이 아무것도 없으니까 true를 반환하다.
3. 조건에 일치하는 요소 찾기
Optional<T> findAny() // 아무거나 하나. 병렬 스트림에 사용
Optional<T> findFirst() // 첫 번째 요소. 순차 스트림에 사용
Optional<Student> result = stuStream.filter(s -> s.getScore() <= 100).findFirst(); Optional<Student> result = ParallelStream.filter(s -> s.getScore() <= 100).findAny();
String[] strArr = { "Java", "Hello", "Hi" }; Optinal<String> Hword = Stream.of(strArr) .filter(s -> s.charAt(0) == "H").findFirst(); // Hello만 반환 Optinal<String> Hword = Stream.of(strArr).parallel() .filter(s -> s.charAt(0) == "H").findAny(); // 랜덤 반환
findFirst()는 순차적으로 찾기 때문에 앞에 있는 Hello를 반환하는 반면 parallel 구조일 때 findAny는 병렬로 찾기 때문에 Hello나 Hi 등 랜덤을 반환한다.
4. 스트림의 요소를 하나씩 줄여가며 누적연산을 수행 - reduce()
Optional<T> reduce(BinaryOperator<T> accumulator)
T reduce(T identity, BinaryOperator<T> accumulator)
identity - 초기값
accumulator - 이전 연산결과와 스트림의 요소에 수행할 연산
// int reduce(int identity, IntBinaryOperator op) int count = intStream.reduce(0, (a,b) -> a + 1); // count() int sum = intStream.reduce(0, (a,b) -> a + b); // sum() int max = intStream.reduce(Integer.MIN_VALUE, (a,b) -> a > b ? a : b); // max() int min = intStream.reduce(Integer.MAX_VALUE, (a,b) -> a < b ? a : b); // min()
sum 하나를 예를 들어서 어떻게 동작하는지 다시 써보면
int a = identity; for(int b : stream) a = a + b; // sum()
위와 같은 코드처럼 동작하는 것이다.
'JAVA > 스트림' 카테고리의 다른 글
collect()와 Collectors (0) 2023.08.09 Optinal (0) 2023.08.09 스트림의 연산 - 중간 연산 (0) 2023.08.08 스트림 만들기 (0) 2023.08.08 스트림 (0) 2023.08.08