Как развернуть 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()),

Другие вопросы по тегам