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消除)仅在流创建期间出现,而不是在评估期间出现,因此它不依赖于流中的元素数量.当终端操作发生时,处理被移交给原始流,因此在您的示例期间map和forEach评估期间不会运行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()).
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |