Как развернуть StreamEx в "Простой старый поток Java"?
StreamEx - мощная библиотека, но в какой-то момент мне больше не нужны ее суперспособности.
Как я могу избавиться от внутренних накладных расходов StreamEx? Может ли это создать проблему?
Ex.
public void process(Path path){
StreamEx.of(Files.lines(path))
.groupRuns(...)
//See below
.unwrap()
//
.map(...)
.forEach(...)
}
1 ответ
Там нет общедоступного метода API, чтобы "развернуть" StreamEx
поток. Это сделано специально. В общем то StreamEx
класс совместим с оригиналом Stream
API, так что если вам нужно пройти 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())
,