Я разрабатываю бесплатную библиотеку [StreamEx][1], которая расширяет стандартное Java 8 Stream API, добавляя туда новые операции, коллекторы и источники стримов. Обычно я не добавляю всё подряд, а всесторонне рассматриваю каждую потенциальную фичу. Например, при добавлении новой промежуточной ([intermediate][2]) операции встают такие вопросы:
1. Будет ли она действительно промежуточной, то есть не будет трогать источник до выполнения терминальной операции?
2. Будет ли она ленивой и вытаскивать из источника не больше данных, чем требуется?
3. Сработает ли она на бесконечном стриме? Требует ли она ограниченный объём памяти?
4. Будет ли она хорошо параллелиться?
Минусик по любому из этих пунктов заставляет серьёзно задуматься, добавлять ли такую операцию. Минусик по первому — это сразу нет. Например, у конкурентов в jOOλ есть операция [shuffle()][3], которая выглядит как промежуточная, но на самом деле прямо сразу потребляет весь стрим в список, перемешивает его и создаёт новый стрим. Я такое не уважаю. Минусики по остальными пунктам не означают сразу нет, потому что есть и стандартные операции, которые их нарушают. Второй пункт нарушает `flatMap()`, третий — `sorted()`, четвёртый — всякие `limit()` и `takeWhile()` (в JDK-9). Но всё-таки я стараюсь этого избегать. Однако на днях я открыл для себя операцию, которая плохо параллелится и в зависимости от использования может не сработать на бесконечном стриме, но всё же слишком хороша. Через неё удаётся буквально в несколько строчек выразить как практически любую существующую промежуточную операцию, так и кучу несуществующих. Я назвал операцию [headTail()][4]. [Читать дальше →][5]
[1]:
https://github.com/amaembo/streamex
[2]:
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps
[3]:
http://www.jooq.org/products/jOO%CE%BB/javadoc/0.9.7/org/jooq/lambda/Seq.html#shuffle--
[4]:
http://amaembo.github.io/streamex/javadoc/one/util/streamex/StreamEx.html#headTail-java.util.function.BiFunction-java.util.function.Supplier-
[5]:
https://habrahabr.ru/post/262139/#habracut