forEach 대 forEachOrdered in Java 8 Stream
이 방법은 실행 순서가 다르지만 모든 테스트에서 다른 순서 실행을 달성 할 수 없다는 것을 이해합니다.
예:
System.out.println("forEach Demo");
Stream.of("AAA","BBB","CCC").forEach(s->System.out.println("Output:"+s));
System.out.println("forEachOrdered Demo");
Stream.of("AAA","BBB","CCC").forEachOrdered(s->System.out.println("Output:"+s));
산출:
forEach Demo
Output:AAA
Output:BBB
Output:CCC
forEachOrdered Demo
Output:AAA
Output:BBB
Output:CCC
두 가지 방법이 다른 출력을 생성하는 경우 예를 제공하십시오.
Stream.of("AAA","BBB","CCC").parallel().forEach(s->System.out.println("Output:"+s));
Stream.of("AAA","BBB","CCC").parallel().forEachOrdered(s->System.out.println("Output:"+s));
두 번째 줄은 항상 출력됩니다.
Output:AAA
Output:BBB
Output:CCC
첫 번째 것은 주문이 유지되지 않기 때문에 보장되지 않습니다. forEachOrdered
스트림이 순차적인지 병렬인지에 관계없이 소스에 지정된 순서대로 스트림의 요소를 처리합니다.
forEach
Javadoc 에서 인용 :
이 작업의 동작은 명시 적으로 비 결정적입니다. 병렬 스트림 파이프 라인의 경우이 작업은 병렬 처리의 이점을 희생 할 수 있으므로 스트림의 발생 순서를 준수한다고 보장하지 않습니다.
forEachOrdered
Javadoc이 다음과 같이 말할 때 (강조 표시) :
스트림에 정의 된 발생 순서가있는 경우 스트림의 발생 순서대로이 스트림의 각 요소에 대한 작업을 수행합니다 .
비록 forEach
짧고 외모가 예뻐, 내가 사용하는 것이 좋을 것 forEachOrdered
주문 사항이 명시 적으로이를 지정할 경우 모든 장소에서. 순차 스트림의 forEach
경우 순서를 존중 하는 것 같고 의미 상 사용이 필요한 스트림 API 내부 코드 사용 forEach
(순차적 인 것으로 알려진 스트림의 경우)도 있습니다 forEachOrdered
. 그럼에도 불구하고 나중에 스트림을 병렬로 변경하기로 결정할 수 있으며 코드가 손상됩니다. 또한 forEachOrdered
코드 리더 를 사용할 때 "순서가 중요합니다"라는 메시지가 표시됩니다. 따라서 코드를 더 잘 문서화합니다.
병렬 스트림의 forEach
경우 비 결정적 순서로 실행될뿐만 아니라 다른 요소에 대해 다른 스레드에서 동시에 실행되도록 할 수도 있습니다 (에서는 불가능 forEachOrdered
).
마지막으로 forEach
/ 둘 다 forEachOrdered
거의 유용하지 않습니다. 대부분의 경우에 당신은 실제로 이렇게 작업처럼,뿐만 아니라 부작용을 몇 가지 결과를 생성 할 필요가 reduce
또는 collect
더 적합해야한다. 자연에 의한 축소 작업을 통해 표현하는 forEach
것은 일반적으로 나쁜 스타일로 간주됩니다.
forEach () 메서드는이 스트림의 각 요소에 대해 작업을 수행합니다. 병렬 스트림의 경우이 작업은 스트림의 순서 유지를 보장하지 않습니다.
forEachOrdered () 메서드는이 스트림의 각 요소에 대해 작업을 수행하여 각 요소가 정의 된 발생 순서가있는 스트림에 대해 발생 순서로 처리되도록합니다.
아래 예를 들어 :
String str = "sushil mittal";
System.out.println("****forEach without using parallel****");
str.chars().forEach(s -> System.out.print((char) s));
System.out.println("\n****forEach with using parallel****");
str.chars().parallel().forEach(s -> System.out.print((char) s));
System.out.println("\n****forEachOrdered with using parallel****");
str.chars().parallel().forEachOrdered(s -> System.out.print((char) s));
산출:
**** forEach는 병렬 사용하지 않음 ****
스실 미탈
**** forEach와 병렬 사용 ****
Mihul Issltat
**** forEachOrdered는 병렬 사용 ****
스실 미탈
참고 URL : https://stackoverflow.com/questions/32797579/foreach-vs-foreachordered-in-java-8-stream
'Program Tip' 카테고리의 다른 글
JSP 용 클래스를 컴파일 할 수 없음 : java.util.Map $ Entry 유형을 분석 할 수 없습니다. (0) | 2020.11.11 |
---|---|
'perf stat'결과에서 stalled-cycles-frontend 및 stalled-cycles-backend는 무엇입니까? (0) | 2020.11.11 |
Docker 컨테이너 내부에 심볼릭 링크가있는 호스트 디렉터리 마운트 (0) | 2020.11.11 |
문자의 유니 코드 값 가져 오기 (0) | 2020.11.11 |
MySQL의 저장 프로 시저에서 디버깅 정보 인쇄 (0) | 2020.11.11 |