Comments 14
Если что, картинки для «причуд» я надёргал с интернета вечером перед докладом, потому что мне показалось, что презентация скучновата. Не уверен, что это было правильное решение.
Мне кажется, или со стримами Java конкретно упёрлась лбом в type erasure и отсутствие деструкторов? "Станцуйте этот танец племён Куру-Кусу, чтобы у вас не утекли ресурсы".
На самом деле Java уперлась не в отсутствие деструкторов, а в тот факт что интерфейс Iterator
не наследуется от AutoCloseable
и уже написана куча библиотек которые не в курсе что некоторый объект может реализовать оба интерфейса.
Для сравнения, в .NET точно так же нет деструкторов — но они вовремя подсуетились, добавив возможность закрывать перечислитель еще в .NET 2.0.
Именно по этой причине в .NET генераторы знают в какой момент их перестают перечислять и могут освободить ресурсы, а в Java стрим об этом даже не догадывается.
@Benchmark
public Optional<Integer> findAny1() {
return IntStream.range(0, 1_000_000)
.boxed().filter(x -> x == 0).findAny();
}
@Benchmark
public Optional<Integer> findAny1Flat() {
return IntStream.of(1_000_000).flatMap(x -> IntStream.range(0, x))
.boxed().filter(x -> x == 0).findAny();
}
Мне кажется, flatMap здесь не совсем корректный — с ним мы мы получим множество (N^2)/2, вместо N, как в первом бенчмарке. Вероятно, должно быть что-то вроде
.flatMap(x -> IntStream.range(x, x))
или
.flatMap(x -> IntStream.of(x))
Такой классный материал - и никто не поблагодарил автора за целых 6 лет?
Спасибо!
Причуды Stream API