Спустя 25 лет настало время для Java получить обновление коллекций.

25 лет Java

В этом году исполняется 25 лет языку программирования Java. В марте 2020 года мы будем отмечать 6-ю годовщину выпуска Java 8, в который вошли Лямбды, Ссылки на методы, Методы по умолчанию и Потоки Java.

Java 8 была и остается потрясающей. После 19 лет без поддержки Lambdas разработчики Java внезапно ощутили удивительный прирост производительности благодаря нескольким отличным дополнениям к языку и основным библиотекам. Java Streams чрезвычайно полезны и удовлетворяют большому количеству случаев использования. Они также дали авторам Java-контента о чем писать, а докладчикам Java-конференций - о чем поговорить.

В то время как структура Java Collections была значительно расширена новыми функциями в Java Streams, Java Streams, к сожалению, скрывает еще больший прирост производительности, повышенную безопасность типов и улучшение производительности.

Давайте выясним, почему по прошествии 25 лет настало время для более совершенной и современной среды Java Collections. Чтобы увидеть то, чего нам все еще не хватает в Java, мы можем взглянуть в прошлое.

40 лет Smalltalk

Сорок лет назад был выпущен Smalltalk-80. Smalltalk настолько повлиял на то, что мы ежедневно используем современные языки программирования и методы разработки программного обеспечения, такие как TDD и рефакторинг.

Smalltalk - это объектно-ориентированный язык программирования с динамическими типами. Smalltalk имеет простой синтаксис, который может поместиться на открытке, и большую библиотеку классов с богатым набором функций. Я профессионально программировал на Smalltalk с 1994 по 2000 год, работая в IBM Global Services в Horizon Blue Cross Blue Shield в Нью-Джерси. Smalltalk сформировал мои представления о программировании за последние 25 лет и напрямую повлиял на то, как я проектирую и программирую на Java.

Я считаю, что одна из самых недооцененных особенностей Smalltalk - это богатая среда коллекций. Коллекции Smalltalk имеют организованную и легкую для изучения иерархию.

Конкретные коллекции в Smalltalk имеют простые фабричные методы для их создания (with:), а некоторые типы коллекций, такие как массивы и строки, имеют буквальный синтаксис. На снимке экрана ниже я создаю Set, OrderedCollection (он же List), Bag, Array, String, Dictionary (он же Map) и Interval, используя Pharo Smalltalk. Smalltalk - это живая среда программирования. В Smalltalk вы можете выделить код в любом месте и выполнить его или проверить результаты и просмотреть их в инспекторе.

API коллекции в Smalltalk очень богат, и многие из общих методов в API определены в корне иерархии в классе Collection.

Чтобы понять, насколько богатым является API Smalltalk Collection, я составил карту разума для класса Pharo Smalltalk Collection, показывающую основные категории методов и отдельные методы. Мне очень не хватает категорий методов в Java, поскольку это отличный способ организовать более крупные API. Каждый подкласс Collection наследует все эти общие поведения.

В Smalltalk уже более 40 лет - 40 лет! По прошествии 25 лет JDK все еще не имеет того же уровня функциональности, доступного непосредственно в коллекциях.

Есть варианты, доступные в сообществе разработчиков открытого исходного кода Java.

16 лет лучших коллекций на Java

Я начал разрабатывать библиотеку под названием Caramel, работая в Goldman Sachs в 2004 году. В 2012 году библиотека была открыта как GS Collections на GitHub. В 2015 году он был перенесен в Eclipse Foundation и стал Коллекциями Eclipse.

Обновлено: я нашел ссылку на доклад, который я провел на саммите по языку JVM в июле 2012 года, под названием Дизайн фреймворка коллекций Java. В своем выступлении я сравнил фреймворки коллекций в Java, Scala, Smalltalk и GS Collections.

Фреймворк Eclipse Collections был вдохновлен фреймворком Smalltalk Collections. В Eclipse Collections есть фабричные классы, которые обеспечивают единообразный способ создания коллекций.

Eclipse Collections также предоставляет богатый API, большинство методов которого определены в родительском интерфейсе с именем RichIterable. Методы, доступные непосредственно в коллекциях, по умолчанию активны. Методы, возвращающие коллекции, такие как select, reject и collect, являются ко-вариантами в Коллекциях Eclipse.

В коллекциях Eclipse доступен ленивый API, вызывающий asLazy.

Изменяемые типы в коллекциях Eclipse расширяют эквивалентные типы коллекций в Java.

  • MutableList расширяет java.util.List
  • MutableSet расширяется java.util.Set
  • MutableMap расширяется java.util.Map
  • MutableBag расширяется java.util.Collection

Это означает, что такие методы, как stream и parallelStream, также доступны для типов коллекций Eclipse.

Eclipse Collections поставляется с Collectors2 классом с Collector реализациями, эквивалентными тем, которые находятся в Collectors, но которые возвращают типы Eclipse Collections.

Если вы хотите увидеть визуализации библиотеки Eclipse Collections, многие из них доступны в следующем блоге.



Сравнение базовых классов Collection в Java

Так в чем же разница между коллекциями Eclipse и фреймворком JDK Collections? На изображении ниже я вычислил разницу и пересечение API MutableCollection и java.util.Collection, используя имена методов без параметров, поэтому перегруженные методы исключены.

Примечание: MutableCollection extends RichIterable, от которого унаследовано множество поведений класса.

На MutableCollection доступно гораздо больше функций. Эти функции непосредственно приводят к повышению производительности Java-разработчиков. Класс MutableCollection расширяет java.util.Collection, поэтому указанные выше пересечения включают все методы из java.util.Collection и из java.lang.Iterable.

Чего сегодня не хватает коллекциям Java?

  1. Функциональные и удобные API прямо в коллекциях
  2. Эффективность памяти
  3. Optimized Eager APIs - узнайте больше о нетерпеливом и ленивом здесь.
  4. Примитивные коллекции для всех примитивных типов
  5. Неизменяемые по контракту коллекции
  6. Lazy Iterable API для объектных и примитивных коллекций
  7. * Отдельная * Параллельная итерационная иерархия
  8. Multimaps
  9. Сумки
  10. Би-карты
  11. Фабрики коллекций Mutable и Immutable
  12. 64-битные коллекции (размер длинный, массивы 64-битные)

Прошлое настоящее и будущее сейчас

Нам есть чему поучиться на Java из Smalltalk. Smalltalk был (возможно, до сих пор) намного опередил свое время. Добавление дополнительного синтаксиса в новые версии языка Java может быть полезным, но нам необходимо обеспечить лучшую поддержку в библиотеках базовых классов, таких как платформа Collections. Я надеюсь увидеть, что многие из этих классических функций коллекций будут добавлены в будущую версию Java. Java - отличная платформа для разработки, и обновленная структура Collections сделает Java еще лучше.

Давайте сделаем Java еще лучше в течение следующих 25 лет.

Если вы хотите воспользоваться этими функциями сегодня, не нужно ждать. Вы можете повысить свою продуктивность и увеличить удовольствие от программирования, используя Коллекции Eclipse прямо сейчас. Коллекции Eclipse доступны в виде библиотеки в Maven Central и не имеют зависимостей. Eclipse Collections - это проект с открытым исходным кодом в Eclipse Foundation, где он получил префикс имени Eclipse. Коллекции Eclipse не связаны и не зависят от Eclipse IDE и работают в любой библиотеке Java, приложении или IDE, которые поддерживают Java 8 или выше.

Примечание. Если вы все еще используете Java 5,6 или 7, надежда еще есть. Версии Eclipse Collections 7.x должны вам подойти. Эта версия также отлично работает с Java 8. Мы наслаждаемся богатыми коллекциями функций Smalltalk с JDK 1.4, которые были доступны, когда я создал первый набор классов в исходной библиотеке Caramel в 2004 году.

Спасибо всем нашим пользователям, участникам, приверженцам, сторонникам и друзьям за поддержку нашего пути к открытому исходному коду в течение последних 8 лет! Ваш вклад, поддержка и отзывы подпитывают нашу мотивацию делать Eclipse Collections еще лучше. Мы работаем над тем, чтобы сделать платформу Java лучшей платформой для программирования на следующие 25 лет. Требуется помощь!

Я руководитель проекта и ответственный за проект OSS Коллекции Eclipse в Eclipse Foundation. Eclipse Collections открыта для пожертвований. Если вам нравится библиотека, вы можете сообщить нам об этом, отметив ее на GitHub.

Другие полезные ресурсы для изучения Java, которые могут вам понравиться
10 вещей, которые Java-программист должен выучить в 2020 году
10 бесплатных курсов для изучения Java с нуля
10 Книги для углубленного изучения Java
10 инструментов, которые должен знать каждый Java-разработчик
10 причин изучать языки программирования Java
10 фреймворков, которые Java и веб-разработчики должны изучить в 2020 году < br /> 10 советов, как стать лучшим Java-разработчиком в 2020 году
5 лучших Java-фреймворков, которые следует изучить в 2020 году
10 библиотек для тестирования, которые должен знать каждый Java-разработчик

Смешайте источники, но соблюдайте правильный баланс между исследованиями и практикой. И, конечно же, удачи в преследовании целей :)