Этот пост продолжает мое исследование возможностей Java9 из моего блога My Top Java 9 Features . Здесь мы экспериментируем с методами статической фабрики коллекций Java9 в интерфейсах List, Set и Map.
Коллекции статических фабричных методов
Java9 облегчает создание неизменяемых списков, используя новые статические фабричные методы
Список и набор
Существует 12 методов Set.of и List.of —
- List.of () или Set.of ()
- List.of (E e1) или Set.of (E e1) для E e10
- List.of (E… elements) или Set.of (E… elements)
Примеры
|
1
2
3
|
jshell> Set.of()$1 ==> []| created scratch variable $1 : Set<Object> |
Обратите внимание на вывод как объект List
К статическому
Список
из (E e1, E e2, E e3) —
|
1
2
3
|
jshell> List.of("one","two","three")$2 ==> [one, two, three]| created scratch variable $2 : List<String> |
Обратите внимание на вывод как список
объект
Количество аргументов продолжает расти до E e10, после чего мы можем использовать vararg —
статический
Список
из (E… элементов)
карта
Точно так же Карта определяет —
- staticMapof ()
- staticMapof (K k1, V v1) — (K k10, V v10)
- staticMapofEntries (Map.Entry
… Записи) — обратите внимание на использование
Map.Entry
Примеры
|
1
2
3
4
5
6
|
jshell> Map.of()$12 ==> {} jshell> Map.of("key1", "value1", "key2", "value2")$13 ==> {key1=value1, key2=value2}| created scratch variable $13 : Map<String,String> |
Характеристика коллекций статических фабричных методов
Общие характеристики этих статических заводских методов: списки, наборы и карты —
- Структурно неизменный — создается исключение UnsupportedOperationException, хотя сами элементы являются неизменяемыми
|
1
2
3
4
5
6
|
jshell> Set<String> immutableSet = Set.of("one","two","three")immutableSet ==> [three, two, one]| created variable immutableSet : Set<String> jshell> immutableSet.add("four")| java.lang.UnsupportedOperationException thrown: |
- Нет пустых значений — выброшено исключение NullPointerException
|
01
02
03
04
05
06
07
08
09
10
|
jshell> List<Object> notNullList = List.of(null)| Warning:| non-varargs call of varargs method with inexact argument type for last parameter;| cast to java.lang.Object for a varargs call| cast to java.lang.Object[] for a non-varargs call and to suppress this warning| List<Object> notNullList = List.of(null);| ^--^| java.lang.NullPointerException thrown:| at List.of (List.java:1030)| at (#10:1) |
- Сериализация — Сериализация, если элементы Сериализуемый
Список конкретных характеристик
- Порядок — Порядок поддерживается так же, как ввод элементов
|
1
2
3
|
jshell> List<String> immutableList = List.of("one","two","three")immutableList ==> [one, two, three]| created variable immutableList : List<String> |
Задать конкретные характеристики
- Отклонить дубликаты — Набор также отклонит дубликаты во время создания с IllegalArgumentException —
|
1
2
|
jshell> Set.of("one","one")| java.lang.IllegalArgumentException thrown: duplicate element: one |
Особенности карты
- Отклонить дубликат Keus — Карта отклонит дубликаты ключей с IllegalArgumentException —
|
1
2
3
4
5
|
jshell> Map.of("key1", "value1", "key1", "value2")| java.lang.IllegalArgumentException thrown: duplicate key: key1| at ImmutableCollections$MapN.<init> (ImmutableCollections.java:680)| at Map.of (Map.java:1326)| at (#15:1) |
- Итерация также не гарантируется
Выводы
Это полезный и быстрый метод для создания неизменяемых коллекций, а jshell предоставляет хороший полигон для изучения новых методов и связанных с ними характеристик.
| Опубликовано на Java Code Geeks с разрешения Мартина Фаррелла, партнера нашей программы JCG . См. Оригинальную статью здесь: Примеры JShell Java9: Коллекции Статические Методы Фабрики
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |