3

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

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

前任。

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

1 回答 1

13

没有公共 API 方法可以“解包”StreamEx流。这是故意的。一般来说,StreamEx该类与原始StreamAPI 兼容,因此如果您需要传递StreamEx一些接受 simple 的代码Stream,您可以毫无顾忌地做到这一点。

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

如果您创建许多简单的短流,StreamEx开销可能会有些显着。例如,如果您StreamExflatMap. 因此,在这种情况下,如果性能很重要并且您不需要StreamEx嵌套的特定操作,Stream那么避免StreamExflatMap. 尽管根据我的测试,差异仅在非常人为的情况下才变得显着(例如,超过 5%)。

请注意,StreamEx与 Stream API 等效项相比,某些操作进行了优化。例如,StreamEx.toList()通常比 快Stream.collect(Collectors.toList())。与. StreamEx.of(persons).map(Person::getName).toList()_persons.stream().map(Person::getName).collect(Collectors.toList())

于 2015-11-23T16:06:10.750 回答