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);
boolean allMatch(Predicate<? super T> predicate)
boolean anyMatch(Predicate<? super T> predicate)
boolean noneMatch(Predicate<? super T> predicate)
boolean hasFailedStu = stuStream.anyMatch(s-> s.getTotalScore()<=100);
Optional<T> findFirst()
Optional<T> findAny()
Optional<Stuedent> result = stuStream.filter(s-> s.getTotalScore() <= 100).findFirst();
Optional<Stuedent> result = parallelStream.filter(s-> s.getTotalScore() <= 100).findAny();
Optional<T> reduce(BinaryOperator<T> accumulator)
T reduce(T identity, BinaryOperator<T> accumulator) // 핵심!!
U reduce(U identity, BiFunction<U, T, U> accumulator, BinaryOperator<U> combiner)
// identity : 초기값
// accumulator : 이전 연산결과와 스트림의 요소에 수행할 연산
// combiner : 병렬처리된 결과를 합치는데 사용할 연산 (병렬 스트림)
위 식에서 U는 별로고 T가 정말 중요!!
또 1, 2번째 코드가 같은 의미이지만 예외처리를 했냐 안 했냐의 차이이다.
예제 Math 함수 stream reduce로 구현
int count = intStream.reduce(0, (a, b) -> a + 1);
int sum = intStream.reduce(0, (a, b) -> a + b);
int max = intStream.reduce(Integer.MIN_VALUE, (a, b) -> a > b ? a : b);
int min = intStream.reduce(Integer.MAX_VALUE, (a, b) -> a < b ? a : b);