Java 8 : 게으른 작업을 위해 API에서 스트림을 전달하는 것이 좋습니다.


12

Guava와 같은 Java 8 람다가 많은 라이브러리에서 출력은 공통 Java Collection Framework 인터페이스를 사용하므로 외부 / 내부 API로 쉽게 전달할 수 있으며 라이브러리 메소드가 수행하는 경우 (예 : lazy filter()transform()) 여전히 일부 지연된 계산을 활용 합니다.

그러나 Java 8 Streams에서 Collection/ 를 얻기위한 호출 Map은 터미널 (즉, 열망)이며 결과를 보유하기 위해 새 데이터 구조를 할당합니다.

중간에 여러 단계와 전략 패턴이있는 복잡한 계산의 경우 중간 결과로 인해 불필요한 할당이 많이 발생합니다.

따라서 사람들은 내부 API (예 : 전략 패턴 전략)를 가져 와서 반환하는 것이 좋은 습관이라고 생각합니까? Stream아니면 게으른 API로 게으르지 만 간소화되지는 않습니다.

편집하다:

나의 주요 관심사 Stream는 그것이 한 번만 소비 될 수 있고 Supplier<Stream<X>>매우 번거로운 것처럼 보일 수 있다는 것입니다. 그것은 단지 당신에게 a를 통과 한 Collection다음 다시 stream()시도 하도록 강요 한다.


구아바와 친구들은 기본 스트림을 이용하기 위해 업데이트되지 않습니까?
Kilian Foth

1
스트림을 가져오고 리턴하는 인터페이스가 있으면 표준 스트림 기능과의 상호 운용성이 실제로 향상됩니다. 인터페이스 호출을 스트림 파이프 라인에 통합 할 수 있습니다.
Philipp

@KilianFoth 거의 1 년 동안 구아바 릴리스가 없었으며 구아바의 람다를 Stream으로 대체하는 데 대한 인기있는 기사가 많이 있습니다. 그러나 그들 중 어느 누구도 구아바 수집 작업이 간절하거나 게으르다는 사실을 다루지 않습니다.
billc.cn

답변:


3

Java 8 Streams의 게으름은 구아바의 Iterables와 동일하게 작동합니다. Iterator에서 Collection을 빌드하면 Iterable을 전달하여 게으르고 평가를 수행해야합니다. 스트림과 이터레이터는 모두 한 번만 사용할 수 있습니다.

따라서 메소드 인터페이스의 경우 (일반적으로 게으름을 허용하는)보다 일반적인 방법은 Stream 인터페이스를 사용하는 것입니다 (이전에는 Iterable을 사용했을 때마다). @Philipp이 말했듯이 스트림 파이프 라인에서 사용할 수 있습니다.

Stream이 이제 공식적인 Java 표준 인터페이스이기 때문에 Streams에서 직접 효율적으로 작업 할 수있는 다른 라이브러리와 함수가 점점 더 많아지기를 바랍니다.

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