gpt4 book ai didi

java - 如何将 StreamEx 解包为 "Plain Old Java Stream"?

转载 作者:搜寻专家 更新时间:2023-11-01 04:07:33 25 4
gpt4 key购买 nike

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

如何摆脱 StreamEx 内部开销?这会带来问题吗?

例如

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

最佳答案

没有公共(public) API 方法来“解开”StreamEx 流。这是故意的。一般来说,StreamEx 类与原始的 Stream API 兼容,因此如果您需要将 StreamEx 传递给一些接受简单 Stream< 的代码,你可以毫无畏惧地做到这一点。

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

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

请注意,与 Stream API 等价物相比,一些 StreamEx 操作已经过优化。例如,StreamEx.toList() 通常比 Stream.collect(Collectors.toList()) 更快。与 persons.stream() 相比,像 StreamEx.of(persons).map(Person::getName).toList() 这样简单的创建 map 收集操作可以快几倍。 map(Person::getName).collect(Collectors.toList()).

关于java - 如何将 StreamEx 解包为 "Plain Old Java Stream"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873345/

25 4 0