如何将StreamEx展开为“a”;普通旧Java流“;?
StreamEx是一个功能强大的库,但在某种程度上我不再需要它的超级功能了 如何消除StreamEx内部开销?这会造成问题吗 前如何将StreamEx展开为“a”;普通旧Java流“;?,java,java-8,java-stream,streamex,Java,Java 8,Java Stream,Streamex,StreamEx是一个功能强大的库,但在某种程度上我不再需要它的超级功能了 如何消除StreamEx内部开销?这会造成问题吗 前 没有公共API方法来“展开”流。这是故意的。一般来说,streamx类与原始的StreamAPI兼容,因此如果需要将streamx传递给一些接受简单Stream的代码,您可以毫不畏惧地执行此操作 使用StreamEx的开销通常很低:每个流步骤只有一个或多个额外调用(其中一些可以通过JIT编译器消除)。这种开销(如果JIT没有消除的话)只在流创建期间出现,而不是在计算期
没有公共API方法来“展开”流。这是故意的。一般来说,
streamx
类与原始的Stream
API兼容,因此如果需要将streamx
传递给一些接受简单Stream
的代码,您可以毫不畏惧地执行此操作
使用StreamEx
的开销通常很低:每个流步骤只有一个或多个额外调用(其中一些可以通过JIT编译器消除)。这种开销(如果JIT没有消除的话)只在流创建期间出现,而不是在计算期间出现,因此它不依赖于流中元素的数量。当终端操作发生时,处理将移交给原始流,因此在您的示例中,在map
和forEach
评估期间,不会运行StreamEx库代码
如果您创建了许多简单的短流,StreamEx
开销可能会有点大。例如,如果在flatMap
中创建StreamEx
实例。因此,在这种情况下,如果性能很重要,并且嵌套的流
不需要特定的streamx
操作,那么最好避免平面图
中的streamx
。尽管根据我的测试,只有在非常人为的情况下,差异才会变得显著(比如超过5%)
请注意,与Stream API等价物相比,一些
StreamEx
操作得到了优化。例如,StreamEx.toList()
通常比Stream.collect(Collectors.toList())
快。简单的创建映射收集操作,如StreamEx.of(persons).map(Person::getName).toList()
可以比persons.stream().map(Person::getName).collector(Collectors.toList())
快几倍,StreamEx
是一个流
,标准操作委托给流
,因此几乎没有开销(除了创建一个或多个对象)。我会让它的作者给出一个恰当的答案:)。
public void process(Path path){
StreamEx.of(Files.lines(path))
.groupRuns(...)
//See below
.unwrap()
//
.map(...)
.forEach(...)
}