StreamEx是一个强大的库,但在某种程度上,我不再需要它的超级能力了。
我如何才能摆脱StreamEx内部开销?这会造成问题吗?
例如。
public void process(Path path){
StreamEx.of(Files.lines(path))
.groupRuns(...)
//See below
.unwrap()
//
.map(...)
.forEach(...)
}发布于 2015-11-23 16:06:10
没有公共API方法来“解包”StreamEx流。这是故意的。通常,StreamEx类与原始的Stream API兼容,所以如果需要将StreamEx传递给一些接受简单Stream的代码,您可以毫不担心地这样做。
使用StreamEx的开销通常很低:每个流步骤只有一个或几个额外的调用(其中一些可以被JIT编译器消除)。这种开销(如果不是JIT消除的话)只出现在流创建期间,而不是在评估期间,因此它不依赖于流中的元素数。当终端操作发生时,处理将被移交给原始流,因此在您的示例中,在map和forEach评估期间,不会运行StreamEx库代码。
如果您创建了许多简单的短流,那么StreamEx开销可能会比较大。例如,如果在StreamEx中创建flatMap实例。因此,在这种情况下,如果性能很重要,并且不需要嵌套Stream的特定Stream操作,那么在flatMap中避免使用StreamEx可能是个好主意。虽然根据我的测试,差别很大(比方说,超过5%)只是在非常人为的情况下。
请注意,与Stream等价物相比,某些StreamEx操作是经过优化的。例如,StreamEx.toList()通常比Stream.collect(Collectors.toList())快。像StreamEx.of(persons).map(Person::getName).toList()这样简单的创建地图收集操作可以比persons.stream().map(Person::getName).collect(Collectors.toList())快几倍。
https://stackoverflow.com/questions/33873345
复制相似问题