>Java >java지도 시간 >왜 ` flatMap()` 이후 Java Stream의 `filter()`가 때때로 게으름을 잃습니까?

왜 ` flatMap()` 이후 Java Stream의 `filter()`가 때때로 게으름을 잃습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-28 12:52:13565검색

Why Does Java Stream's `filter()` After `flatMap()` Sometimes Lose Laziness?

FlatMap이 완전히 지연되지 않은 후의 Java 스트림 필터

Java 스트림은 일련의 변환을 통해 데이터 파이프라인을 처리하는 방법을 제공합니다. 중간 작업은 일반적으로 게으르다. 즉, 터미널 작업이 호출될 때까지 실행되지 않습니다. 그러나 특정 시나리오에서 flatMap() 다음에 filter()를 적용하면 게으르지 않은 동작이 발생할 수 있는 것으로 관찰되었습니다.

예제 코드

다음을 고려하세요. 코드:

System.out.println(
        "Result: " +
                Stream.of(1, 2, 3)
                        .filter(i -> {
                            System.out.println(i);
                            return true;
                        })
                        .findFirst()
                        .get()
);
System.out.println("-----------");
System.out.println(
        "Result: " +
                Stream.of(1, 2, 3)
                        .flatMap(i -> Stream.of(i - 1, i, i + 1))
                        .flatMap(i -> Stream.of(i - 1, i, i + 1))
                        .filter(i -> {
                            System.out.println(i);
                            return true;
                        })
                        .findFirst()
                        .get()
);

출력

1
Result: 1
-----------
-1
0
1
0
1
2
1
2
3
Result: -1

설명

첫 번째 경우에는 필터링 연산이 적용됩니다. flatMap() 이전에 지연 평가가 발생합니다. 평가는 일치하는 첫 번째 요소(1)에서 중지됩니다.

두 번째 경우 flatMap() 작업은 9개 요소(-1, 0, 1, 0, 1, 2, 1)로 구성된 새 스트림을 생성합니다. , 2, 3). 후속 filter() 작업이 이러한 각 요소에 적용되어 지연되지 않는 동작이 발생합니다. 일치하는 요소(-1)를 찾았음에도 불구하고 평가에서는 스트림의 모든 요소를 ​​계속 처리합니다.

수정

이 문제는 JDK-8075939에서 해결되었습니다. Java 10에서 수정되었습니다. Java 8로 백포트되었습니다. JDK-8225328.

이 수정을 통해 flatMap() 및 filter() 작업이 모두 있는 경우 지연 평가가 유지됩니다. 즉, 이제 일치하는 요소가 발견되는 즉시 평가가 종료됩니다.

의미

이 수정 사항은 다음과 같은 경우 지연되지 않은 동작으로 인해 발생할 수 있는 문제를 해결합니다. flatMap()과 filter()를 사용합니다. 조기 종료가 예상되는 경우 스트림 파이프라인의 성능과 정확성을 향상시킵니다.

위 내용은 왜 ` flatMap()` 이후 Java Stream의 `filter()`가 때때로 게으름을 잃습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.