如何将StreamEx解包为“普通的旧Java流”?
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()). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |