Статьи

Пример Java 9 — фабричные методы для сбора — создание неизменяемого списка, набора и карты

Здравствуйте, ребята, это моя первая статья о функциях Java 9 в этом блоге, и сегодня вы узнаете о моей любимой функции «фабричные методы для сбора» , которая представлена ​​как часть JEP 269. JEP означает предложение по расширению JDK. Если вы работали в Groovy или Kotlin, то вы знаете, как легко создать список с элементами, используя литералы коллекций, например, для создания списка 1, 2, 3, вы можете просто написать val items = listOf(1, 2, 3) , К сожалению, Java пока не поддерживает это, но все было улучшено с помощью фабричных методов для сбора в JDK 9, и это почти так. JDK добавил статические фабричные методы, такие как of() в базовые интерфейсы Collection, которые можно использовать для создания списка элементов.

Несмотря на то, что системы Project Jigsaw или Java Module являются основной изюминкой выпуска Java 9, есть несколько других полезных функций, которые более полезны с точки зрения разработки, например, процесс API Enchantment, усовершенствования Stream API и некоторые полезные методы в классе Optional , но изменение API, которое мне понравилось больше всего, это фабричные методы для Collection.

Он позволяет вам создать список, набор и карту значений в одну строку, как вы можете это сделать в Kotlin , Scala или Groovy :

1
List<String> list = List.of("Java", "Kotlin", "Groovy");

Но единственное преимущество заключается в том, что вы можете создать неизменяемый или неизменный список, набор или карту.

List, Set или Map, возвращаемые статическим фабричным методом of() являются структурно неизменными, что означает, что вы не можете добавлять, удалять или изменять элементы после добавления.

Вызов любого метода-мутатора всегда вызывает UnsupportedOperationException . Однако, если содержащиеся элементы сами являются изменяемыми, это может привести к тому, что Коллекция будет вести себя непоследовательно или ее содержимое может измениться.

Это то же самое, что неизменяемый список, который вы создаете в JDK 6 или 7, как показано ниже:

1
2
3
4
5
6
List<String> listOfString = new List<>();
listOfString.add("Java");
listOfString.add("Kotlin");
listOfString.add("Groovy");
listOfString.add("Scala");
listOfString = Collections.unmodifiableList(listOfString);

Список, возвращаемый методом unmodifiableList() также не поддерживает операции добавления, удаления или установки и создает исключение UnsupportedOperationException если вы их вызываете.

Единственное различие между двумя кодами заключается в том, что раньше для создания неизменяемой коллекции требовалось более 6 строк кода, например неизменяемого списка, набора или карты, но теперь вы можете сделать это всего за одну строку.

Есть также несколько перегруженных версий List.of() , доступных в интерфейсе List, например, чтобы позволить вам создать неизменный список из 1-10 элементов и метод переменных аргументов, который позволяет вам создавать список любого количества элементов.

То же самое верно и для Set.of( ) и Map.of() . Вот пример создания неизменяемого набора в Java 9:

1
Set<Integer> primes = Set.of(2,3,5,7);

Вы можете видеть, что вы можете создать неизменный Набор всего за одну строку. Аналогично, для создания неизменяемой карты JDK 9 предоставляет два метода Map.of(K k1, V v1) и Map.ofEntries() , используя эти две функции, вы можете создать карту неизменяемых записей, например:

Этот метод перегружен для создания карты до 10 пар ключ-значение, но если вам нужна карта большего размера с большим отображением, вам следует использовать Map.ofEntries() .

Кстати, вы знаете, как реализована эта функция? и почему это не было доступно раньше? Если вы посмотрите на код JDK 9 или Javadoc, то обнаружите, что эта функция реализована путем добавления статического метода фабрики в ключевые интерфейсы инфраструктуры Java Collection, например List, Set и Map.

Это было невозможно до JDK 8, потому что добавление метода в интерфейс означает разрушение всех его клиентов, и статические методы не были разрешены в интерфейсе. Ситуация изменилась в Java 8 с введением стандартных и статических методов в интерфейсе, которые открывают путь для оценки JDK API.

Я надеюсь, что в будущем появятся новые подобные возможности, что сделает использование JDK API еще проще.

Кроме того, правила, которые применяются к использованию различных коллекций, также применяются (как и следовало ожидать) при использовании этих фабричных методов. Таким образом, вы не можете передать дубликат элемента при создании набора, потому что набор не позволяет дублировать .

Точно так же вы не можете передавать дубликаты ключей при создании карты, потому что карта не допускает дублирования ключей. Если вы это сделаете, то IllegalArgumentException будет брошен

Кроме того, вы не можете передать нулевое значение методу фабрики коллекций, если вы это делаете, будьте готовы к исключениям Java, NullPointerException .

Это все о том, как создать неизменный список, набор и карту в Java 9 . Статический метод в коллекциях действительно облегчил использование API коллекций Java и, по крайней мере, теперь похож на то, что предлагают Kotlin или Groovy. JDK 9 полон такой полезной функции и следите за появлением новых статей в этом блоге.

Другие статьи о Java и программировании, которые вам могут понравиться

Спасибо за чтение этой статьи до сих пор. Если вам нравится эта функция Java 9, поделитесь с друзьями и коллегами. Если у вас есть какие-либо вопросы для обратной связи, пожалуйста, оставьте записку.

См. Оригинальную статью здесь: Пример Java 9 — фабричные методы для сбора — создание неизменяемого списка, набора и карты

Мнения, высказанные участниками Java Code Geeks, являются их собственными.