Program Tip

forEach 대 forEachOrdered in Java 8 Stream

programtip 2020. 11. 11. 20:33
반응형

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스트림이 순차적인지 병렬인지에 관계없이 소스에 지정된 순서대로 스트림의 요소를 처리합니다.

forEachJavadoc 에서 인용 :

이 작업의 동작은 명시 적으로 비 결정적입니다. 병렬 스트림 파이프 라인의 경우이 작업은 병렬 처리의 이점을 희생 할 수 있으므로 스트림의 발생 순서를 준수한다고 보장하지 않습니다.

forEachOrderedJavadoc이 다음과 같이 말할 (강조 표시) :

스트림에 정의 된 발생 순서가있는 경우 스트림의 발생 순서대로이 스트림의 각 요소에 대한 작업을 수행합니다 .


비록 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

반응형