Collection.stream (). filter (). forEach ()가 각 루프의 표준에 비해 비효율적입니까?


15

IntelliJ IDEA는 지금 다음 for-each 루프를 Java 8 "forEach"호출로 교체 할 것을 권장했습니다.

    for (Object o : objects) {
        if (o instanceof SomeObject) {
            doSomething();
        }
    }

권장 통화는 다음과 같습니다.

objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething());

Stream의 기본 기능이 어떻게 작동하는지 오해하지 않는 한, 스트림 사용은 표준 for-each 루프의 O (n) 연산과 반대로 O (2n) 연산 인 것처럼 보입니다.


8
왜 O ^ 2라고 생각합니까? 실제로 스트림은 (a) 더 좋은 구문을 허용하고 (b) 추가 오버 헤드를 발생 시키지 않기 위해 특별히 고안 되었습니다. (실제로, 그들은 종종 게으른 평가를 통해 오버 헤드를 입니다.)
Kilian Foth

구문을 기반으로하면 필터링을 반복 한 다음 필터링 된 객체를 두 번 반복하여 코드를 실행하는 것처럼 보입니다.
Mirrana

6
비록 그렇게하더라도 여전히 O (2 * N), 즉 O (N), 즉 선형이고 2 차적이지 않습니다. 그러나 실제로 반복은 서로 인터리브되며 결과가 이미 알려진 경우 둘 다 일찍 종료 될 수 있습니다. 이것이 바로 스트림의 아름다움입니다. Java 8의 스트림을 읽는 데 15 분을 소비 할 가치가 있습니다. Venkat Subramaniam이 쓴 것처럼``람다 표현은 Java 8의 관문 약물이지만 스트림은 진정한 중독입니다. ''
Kilian Foth

1
게다가 : 당신의 루프는 반 패턴입니다;)
토마스 정크

1
@ThomasJunk 반 패턴에 대해 설명 할 수 있습니까? 나는 이것에 익숙하지 않다.
Mirrana

답변:


21

구문이 의미하는 바에도 불구하고 Java 스트림은 각 명령문마다 한 번씩 콜렉션을 반복하지 않습니다. 한 번에 하나씩 각 요소에 전체 체인을 적용합니다.

귀하의 경우 스트림은 루프와 정확히 동일하게 작동합니다. 요소를 가져 와서 술어와 비교 한 후 조작을 적용한 후 다음 요소로 이동하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.