Если что, картинки для «причуд» я надёргал с интернета вечером перед докладом, потому что мне показалось, что презентация скучновата. Не уверен, что это было правильное решение.

Мне кажется, или со стримами 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))

Нет. Тут сперва создаётся стрим из одного элемента и флэтмэпится на миллион. В этом и суть.

Точно, это я невнимательно прочитал. Спасибо :)
Для Benchmarkов тут что используется? Очень похоже на junit, хочется тоже освоить.
Подозреваю, что это jmh.
JMH
я всегда буду обновлять комментарии
Выглядит как JMH
А итератор починить они там не планируют?
Только полноправные пользователи могут оставлять комментарии.
Войдите, пожалуйста.