Готварска книга за колекции от Гуава

1. Въведение

Тази статия от готварска книга е организирана в малки и фокусирани рецепти и кодови фрагменти за използване на колекции в стил Гуава.

Форматът е този на нарастващ списък с примери за код, без допълнително обяснение - той има за цел да улесни достъпа до общите употреби на API по време на разработката.

2. Рецептите

понижи списък до списък

- забележка : това е заобиколно решение за нековариантни генерирани колекции в Java

class CastFunction implements Function { @Override public final T apply(final F from) { return (T) from; } } List originalList = Lists.newArrayList(); List theList = Lists.transform(originalList, new CastFunction());

по-проста алтернатива без Гуава - включваща 2 актьорски операции

List originalList = Lists.newArrayList(); List theList = (List) (List) originalList;

добавяне на итерируемо към колекция

Iterable iter = Lists.newArrayList(); Collection collector = Lists.newArrayList(); Iterables.addAll(collector, iter);

проверете дали колекцията съдържа елемент (и) съгласно персонализирано правило за съвпадение

Iterable theCollection = Lists.newArrayList("a", "bc", "def"); boolean contains = Iterables.any(theCollection, new Predicate() { @Override public boolean apply(final String input) { return input.length() == 1; } }); assertTrue(contains);

алтернативно решение, използващо търсене

Iterable theCollection = Sets.newHashSet("a", "bc", "def"); boolean contains = Iterables.find(theCollection, new Predicate() { @Override public boolean apply(final String input) { return input.length() == 1; } }) != null; assertTrue(contains);

алтернативно решение, приложимо само за комплекти

Set theCollection = Sets.newHashSet("a", "bc", "def"); boolean contains = !Sets.filter(theCollection, new Predicate() { @Override public boolean apply(final String input) { return input.length() == 1; } }).isEmpty(); assertTrue(contains);

NoSuchElementException на Iterables.find, когато нищо не е намерено

Iterable theCollection = Sets.newHashSet("abcd", "efgh", "ijkl"); Predicate inputOfLengthOne = new Predicate() { @Override public boolean apply(final String input) { return input.length() == 1; } }; String found = Iterables.find(theCollection, inputOfLengthOne);

- това ще хвърли на NoSuchElementException изключение :

java.util.NoSuchElementException at com.google.common.collect.AbstractIterator.next(AbstractIterator.java:154) at com.google.common.collect.Iterators.find(Iterators.java:712) at com.google.common.collect.Iterables.find(Iterables.java:643)

- решение : има претоварен метод за намиране , който приема стойността на връщане по подразбиране като аргумент и може да бъде извикан с null за желаното поведение:

String found = Iterables.find(theCollection, inputOfLengthOne, null);

премахване на всички нулеви стойности от колекция

List values = Lists.newArrayList("a", null, "b", "c"); Iterable withoutNulls = Iterables.filter(values, Predicates.notNull());

създайте директно неизменяем списък / набор / карта

ImmutableList immutableList = ImmutableList.of("a", "b", "c"); ImmutableSet immutableSet = ImmutableSet.of("a", "b", "c"); ImmutableMap imuttableMap = ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3");

създайте неизменим Списък / Набор / Карта от стандартна колекция

List muttableList = Lists.newArrayList(); ImmutableList immutableList = ImmutableList.copyOf(muttableList); Set muttableSet = Sets.newHashSet(); ImmutableSet immutableSet = ImmutableSet.copyOf(muttableSet); Map muttableMap = Maps.newHashMap(); ImmutableMap imuttableMap = ImmutableMap.copyOf(muttableMap);

алтернативно решение, използващо строители

List muttableList = Lists.newArrayList(); ImmutableList immutableList = ImmutableList. builder().addAll(muttableList).build(); Set muttableSet = Sets.newHashSet(); ImmutableSet immutableSet = ImmutableSet. builder().addAll(muttableSet).build(); Map muttableMap = Maps.newHashMap(); ImmutableMap imuttableMap = ImmutableMap. builder().putAll(muttableMap).build();

3. Още готварски книги на Гуава

Guava е изчерпателна и фантастично полезна библиотека - ето още няколко API, обхванати във формата на готварски книги:

  • Guava Поръчка на готварска книга

  • Функционална готварска книга на Гуава

Наслади се.

4. Напред

Както споменах в началото, експериментирам с този различен формат - готварската книга - за да се опитам да събера прости общи задачи за използване на колекции от Гуава на едно място. Фокусът на този формат е простотата и бързината, така че повечето рецепти нямат допълнително обяснение, освен самия пример на кода .

И накрая - гледам на това като на жив документ - ще продължавам да добавям рецепти и примери, докато се сблъсквам с тях. Чувствайте се свободни да предоставите повече в коментарите и ще се опитам да ги включа в готварската книга.

Внедряването на всички тези примери и кодови фрагменти може да бъде намерено в GitHub - това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.