forEach(지정된 작업)
, forEachOrderd(지정된 작업)
💡 실습
중간연산
range(1, 10)
,(범위)(1~10까지, 10은포함 X)sequential()
(직렬스트림, 스트림의 작업을 직렬로 처리) → 123456789parallel()
(병렬스트림, 스트림 작업을 병렬로 처리) → 683295714 (순서보장 X)
forEach()
,forEachOrderd()
의 차이
forEachOrderd()
→ 얘는 순서 보장이 된다
- 따라서 병렬스트림임에도 순서가 보장됨 (병렬인데 순서보장? → 성능은 조금 떨어질수도)
public static void main(String[] args) { String[] strArr = { //문자열 배열 "Inheritance", "Java", "Lambda", "stream", "OptionalDouble", "intStream", "count", "sum" }; Stream.of(strArr) .forEach(System.out::println); //순서가 보장됨(직렬처리) Stream.of(strArr) .forEachOrdered(System.out::println);//병렬처리(순서가 보장되지 않음)
allMatch()
, anyMatch()
, noneMAtch()
allMatch(조건식)
→ 모든 요소가 조건을 만족하면 trueanyMatch(조건식)
→ 한 요소라도 조건을 만족하면 truenoneMAtch()
→ 모든 요소가 조건을 만족시키지 않으면 true💡 실습
stuStream
학생들 스트림(배열, 컬렉션)에 → 총점이 100점 이하인 사람이 있는지확인anyMatch(조건식)
이기때문에 한명이라도 있으면 true
public static void main(String[] args) { String[] strArr = { //문자열 배열 "Inheritance", "Java", "Lambda", "stream", "OptionalDouble", "intStream", "count", "sum" }; boolean noEmptyStr = Stream.of(strArr).noneMatch(s -> s.length() == 0); System.out.println("noEmptyStr: " + noEmptyStr); //noEmptyStr: true
findFirst()
, findAny()
null
일도 있기에 → Optional로 반환findFirst()
→ 순차, 직렬스트림에 사용하기에 조건에 맞는요소를 발견하면 반환하면됨(첫번째요소)findAny()
→ 병렬스트림에 사용되기에 조건에 맞는 요소를 순차적으로 찾을수 없음 → 조건 맞으면 바로 아무거나 바로 반환💡 실습
filter(조건)
과 함께 사용한다. (총합이 100점이하인 요소)findFirst()
→ 조건을 만족하는 첫번째 요소를 반환findAny()
-> 조건을 만족하는 아무거나 바로 반환한다.
public static void main(String[] args) { String[] strArr = { //문자열 배열 "Inheritance", "Java", "Lambda", "stream", "OptionalDouble", "intStream", "count", "sum" }; Optional<String> sWord = Stream.of(strArr) .filter(s ->s.charAt(0) == 's').findFirst(); System.out.println("sWord: " + sWord.get()); }
reduce()
identity
초기값, accumulator
수행할 연산 → 이 2가지가 가장 중요하다.reduce(초기값, 수행할 연산)
reduce()
최종연산에선 초기값이 없음으로 결과가 → null이 나올수도 있어서 Optional
로 반환했다.💡 실습
- count → 요소를 하나 꺼낼때마다 1씩 증가
String[] strArr = { //문자열 배열 "Inheritance", "Java", "Lambda", "stream", "OptionalDouble", "intStream", "count", "sum" }; //Stream<String>을 -> IntStream으로 변환 (IntStream)은 기본형 스트림 //intStream1, intStream2 등등은 기본형 스트림 이기 때문에 계산가능 IntStream intStream1 = Stream.of(strArr).mapToInt(String::length); IntStream intStream2 = Stream.of(strArr).mapToInt(String::length); IntStream intStream3 = Stream.of(strArr).mapToInt(String::length); IntStream intStream4 = Stream.of(strArr).mapToInt(String::length); int count = intStream1.reduce(0, (a, b) -> a + 1); int sum = intStream2.reduce(0, (a, b) -> a + b);