Можно ли реализовать свою промежуточную операцию в Java Stream API?

«Можно ли реализовать свою промежуточную операцию в Java Stream API?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно, но не напрямую через стандартный API. Промежуточные операции (intermediate operations) в Stream API являются внутренними методами интерфейса Stream. Однако вы можете создать свой собственный потоковый пайплайн, комбинируя существующие операции или используя StreamSupport и собственный Spliterator.

Практический подход: Создайте утилитный метод, который возвращает Stream с примененными вашими преобразованиями.

public class CustomStreamOperations {
    public static <T> Stream<T> filterAndTransform(Stream<T> source, Predicate<T> filter, Function<T, T> transformer) {
        return source.filter(filter).map(transformer);
    }
}

// Использование
List<String> result = CustomStreamOperations
    .filterAndTransform(stream, s -> s.length() > 3, String::toUpperCase)
    .collect(Collectors.toList());

Важно: Реализация полностью новой низкоуровневой промежуточной операции (как filter или map) требует создания собственной реализации Stream, что крайне сложно и не рекомендуется, так как нарушает контракты и может быть несовместимо с будущими версиями Java.