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!
병렬 스트림 생성을 통한 성능의 향상은 실행 결과를 기반으로 평가해야 한다.
'# 02 > Java' 카테고리의 다른 글
[윤성우 열혈자바] 31-2. 시간대를 적용한 코드 작성 그리고 출력 포맷의 지정 (0) | 2019.10.28 |
---|---|
[윤성우 열혈자바] 31-1. 시각과 날짜 관련 코드의 작성 (0) | 2019.10.28 |
[윤성우 열혈자바] 30-2. 스트림의 중간 연산 (0) | 2019.10.28 |
[윤성우 열혈자바] 30-1. 스트림의 생성과 연결 (0) | 2019.10.28 |
[윤성우 열혈자바] 29-3. 리덕션, 병렬 스트림 (0) | 2019.10.28 |