如何将StreamEx解包为"普通的旧Java流"?

Cer*_*ber 3 java java-8 java-stream streamex

StreamEx是一个功能强大的库,但在某些时候我不再需要它的超级大国了.

我怎么能摆脱StreamEx内部开销?这会造成问题吗?

防爆.

public void process(Path path){
    StreamEx.of(Files.lines(path))
        .groupRuns(...)
        //See below 
        .unwrap()
        //
        .map(...)
        .forEach(...)
}
Run Code Online (Sandbox Code Playgroud)

Tag*_*eev 13

没有用于"解包" StreamEx流的公共API方法.这是故意的.通常,StreamEx该类与原始StreamAPI 兼容,因此如果您需要传递StreamEx一些接受简单的代码Stream,您可以毫无顾虑地执行此操作.

使用的开销StreamEx通常非常低:每个流步骤只有一个或几个额外的调用(其中一些可以被JIT编译器消除).这种开销(如果没有被JIT消除)仅在流创建期间出现,而不是在评估期间出现,因此它不依赖于流中的元素数量.当终端操作发生时,处理被移交给原始流,因此在您的示例期间mapforEach评估期间不会运行StreamEx库代码.

StreamEx如果你创建了很多简单的短流开销可能有点显著.例如,如果您在StreamEx内部创建实例flatMap.因此,在这种情况下,如果性能很重要并且您不需要针对StreamEx嵌套的特定操作Stream,那么最好避免StreamEx在内部进行操作flatMap.虽然根据我的测试,差异仅在非常人为的情况下变得显着(例如,超过5%).

请注意,StreamEx与Stream API等效项相比,某些操作已经过优化.例如,StreamEx.toList()通常比快Stream.collect(Collectors.toList()).简单的create-map-collect操作就像StreamEx.of(persons).map(Person::getName).toList()可以工作快几倍persons.stream().map(Person::getName).collect(Collectors.toList()).