Почему java.util.Collection не реализует новый интерфейс Stream?

Я просто потратил некоторое время, чтобы начать изучать шум java-8 о streamах и lambdaх. Меня .filter() то, что вы не можете применять операции Stream, такие как .map() , .filter() непосредственно на java.util.Collection . Есть ли техническая причина, по которой интерфейс java.util.Collection не был расширен с реализацией по умолчанию этих операций Stream?

Поймав немного, я вижу множество примеров кодирования людей по шаблону:

 List list = someListExpression; List anotherList = list.stream().map(x -> f(x)).collect(Collectors.toList()); 

который становится очень неуклюжим, если в вашем коде есть много этих streamов. Поскольку .stream() и .collect() полностью не соответствуют тому, что вы хотите выразить, вы хотели бы сказать:

 List list = someListExpression; List anotherList = list.map(x -> f(x)); 

Да, есть отличные причины для этих решений 🙂

Ключом является различие между нетерпеливыми и ленивыми операциями. Примеры, которые вы даете по первому вопросу, показывают нетерпеливые операции, когда отображение или фильтрация списка создает новый список. В этом нет ничего плохого, но часто это не то, что вы хотите, потому что вы часто делаете больше работы, чем вам нужно; нетерпевая операция должна действовать на каждом элементе и создавать новую коллекцию. Если вы составляете несколько операций (filter-map-reduce), вы делаете много дополнительной работы. С другой стороны, ленивые операции составляют красиво; если вы это сделаете:

  Optional tallestGuy = people.stream() .filter(p -> p.getGender() == MALE) .max(comparing(Person::getHeight)); 

операции фильтрации и уменьшения (max) объединяются в один проход. Это очень эффективно.

Итак, почему бы не разоблачить методы Stream прямо в List? Ну, мы попробовали это так. Среди множества других причин мы обнаружили, что смешивание ленивых методов, таких как filter() и нетерпеливые методы, такие как removeAll() вводит пользователей в заблуждение. Сгруппировав ленивые методы в отдельную абстракцию, она становится намного яснее; методы в List – это те, которые мутируют список; методы Stream – это те, которые работают с удобными, ленивыми операциями над последовательностями данных независимо от того, где эти данные живут.

Итак, как вы предлагаете, это здорово, если вы хотите делать действительно простые вещи, но начинаете разваливаться, когда пытаетесь построить на нем. Не раздражает ли метод extra stream() ? Конечно. Но сохранение абстракций для структур данных (которые в основном связаны с организацией данных в памяти) и streamов (которые в основном связаны с составлением совокупного поведения) раздельно масштабируются для более сложных операций.

К вашему второму вопросу вы можете сделать это относительно легко: реализовать streamовые методы следующим образом:

 public Stream map(Function mapper) { return convertToStream().map(mapper); } 

Но это просто плавание против прилива; лучше просто реализовать эффективный метод stream ().

  • Разница между сокращением и foldLeft / fold в функциональном программировании (в частности, Scala и Scala API)?
  • Рекурсивная функция хвоста для поиска глубины дерева в Ocaml
  • Почему нет дженериков в Go?
  • java lambda возвращает лямбду
  • Какую задачу лучше всего выполнять в стиле функционального программирования?
  • Есть ли способ сделать currying в C?
  • Связать Vs Лямбда?
  • Разделить stream Java 8
  • std :: bind перегрузка
  • Возможно ли программирование графического интерфейса?
  • Какова мотивация присвоения Scala для оценки Unit вместо присвоенного значения?
  • Interesting Posts

    Жирные модели, тощие controllerы и шаблон проектирования MVC

    CubicCurve2D, соединяющий два экземпляра JInternalFrame

    Как предотвратить циклическую ссылку, когда Swift-заголовок заголовка импортирует файл, который импортирует сам Hopscotch-Swift.h

    Как установить автоответчики на определенные дни в Microsoft Outlook?

    Как получить список загруженных видео для определенного канала с новым API данных YouTube (V3)?

    Разрешение отклонено (публикация) при доступе SSH к экземпляру Amazon EC2

    JAVA – Лучший подход к анализу огромного (особо большого) файла JSON

    VirtualBox: как я могу добавить (смонтировать) файл образа ISO из командной строки?

    Как получить код состояния HTTP с помощью jQuery?

    Is “for (;;)” быстрее чем “while (TRUE)”? Если нет, то почему люди используют его?

    Android: Разрешение отказа: начало намерения с отмененным разрешением android.permission.CAMERA

    Рам не признан

    Ошибка в WinPE «BIOS в этой системе не полностью совместим с ACPI»

    Оператор ‘<' зарезервирован для будущего использования

    Как изменить заголовок HttpUrlConnection

    Давайте будем гением компьютера.