加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 05:13:25 所属栏目:Java 来源:网络整理
导读:StreamEx是一个功能强大的库,但在某些时候我不再需要它的超级大国了. 我怎么能摆脱StreamEx内部开销?这会造成问题吗? 防爆. public void process(Path path){ StreamEx.of(Files.lines(path)) .groupRuns(...) //See below .unwrap() // .map(...) .forEac
StreamEx是一个功能强大的库,但在某些时候我不再需要它的超级大国了.

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

防爆.

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

解决方法

没有公开的API方法来“解包”StreamEx流.这是故意的.通常,StreamEx类与原始Stream API兼容,因此如果您需要将StreamEx传递给某些接受简单Stream的代码,您可以毫不畏惧地执行此操作.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读