1. Общ преглед
В този бърз урок ще представим различни методи за инициализиране на HashSet със стойности по време на неговото изграждане .
Ако вместо това искате да изследвате функциите на HashSet , вижте тази основна статия тук.
Ще се потопим в вградените в Java методи от Java 5 и преди, последвано от нов механизъм, въведен от Java 8 . Също така ще видим персонализиран метод на помощната програма и накрая ще изследваме функциите, предоставени от библиотеките за събиране на трети страни , по-специално Google Guava.
Ако имате късмет, че вече сте мигрирали към JDK9 +, можете просто да използвате фабрични методи за събиране.
2. Вградени методи на Java
Нека започнем с разглеждане на три вградени механизма, налични от Java 5 или преди .
2.1. Използване на друг екземпляр на колекция
Можем да предадем съществуващ екземпляр на друга колекция, за да инициализираме Set . В долния пример използваме вграден създаден Списък :
Set set = new HashSet(Arrays.asList("a", "b", "c"));
2.2. Използване на анонимен клас
В още един друг подход можем да използваме анонимния клас, за да добавим елемент към HashSet .
Обърнете внимание на използването на двойни къдрави скоби. Този подход е технически много скъп, тъй като създава анонимен клас всеки път, когато бъде извикан.
Така че в зависимост от това колко често трябва да инициализираме Set, можем да се опитаме да избегнем използването на този подход:
Set set = new HashSet(){{ add("a"); add("b"); add("c"); }};
2.3. Използване на полезен метод на колекции от Java 5
Класът на помощната програма на Collections на Java предоставя метода с име singleton за създаване на Set с един елемент . Екземплярът Set, създаден с метода singleton , е неизменим, което означава, че не можем да добавим повече стойности към него.
Има ситуации, особено при модулното тестване, когато трябва да създадем набор с една стойност:
Set set = Collections.singleton("a");
3. Дефиниране на персонализиран метод на полезност
Можем да дефинираме статичен краен метод, както по-долу. Методът приема променливи аргументи .
Използване на Collections.addAll, който приема обекта за събиране и масив от стойности, е най-добър сред другите поради ниските режийни разходи за копиране на стойности.
В метод е използване на генерични лекарства, така че ние може да премине ценности от всякакъв вид:
public static final Set newHashSet(T... objs) { Set set = new HashSet(); Collections.addAll(set, objs); return set; }
Полезният метод може да се използва в нашия код, както е показано по-долу.
Set set = newHashSet("a","b","c");
4. Използване на поток от Java 8
С въвеждането на Stream API в Java 8 имаме допълнителни опции. Можем да използваме Stream с колектори, както е показано в кода по-долу:
Set set = Stream.of("a", "b", "c") .collect(Collectors.toCollection(HashSet::new));
5. Използване на библиотека за събиране на трети страни
Има множество библиотеки на колекции на трети страни, включително Google Guava, Apache Commons Collections и Eclipse Collections, за да назовем само няколко.
Тези библиотеки предоставят удобни полезни методи за инициализиране на колекции като Set. Тъй като Google Guava е един от най-често използваните тук, имаме пример от него. Guava разполага с удобни методи за изменяеми и неизменяеми обекти на Set :
Set set = Sets.newHashSet("a", "b", "c");
По същия начин Guava има клас на помощна програма за създаване на неизменяеми екземпляри на Set , както можем да видим в примера по-долу.
Set set = ImmutableSet.of("a", "b", "c");
6. Заключение
В заключение видяхме множество начини, по които HashSet може да бъде инициализиран, докато е конструиран. Тези подходи не обхващат непременно всички възможни начини по никакъв начин. Това беше просто опит да се покажат най-често срещаните начини.
Един такъв подход, който не е разгледан тук, може да бъде използването на конструктора на обекти за конструиране на набор .
Както винаги пример за работещ код е достъпен в GitHub.