Guava Коллекции Поваренная книга
1. Вступление
Эта статья в кулинарной книге организована вsmall and focused recipes and code snippets для использования коллекций в стиле Guava.
Формат соответствует форматуa growing list of code examples, без дополнительных пояснений - он предназначен для облегчения доступа к обычным способам использования API во время разработки.
2. Рецепты
приведение списка
-note: это обходной путь для нековариантных обобщенных коллекций в 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());
более простая альтернатива без Guava - включает 2 операции приведения
List originalList = Lists.newArrayList();
List theList = (List) (List extends Number>) 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);
- это вызоветthe NoSuchElementException exception:
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)
-solution: существуетan overloaded find method, который принимает в качестве аргумента значение, возвращаемое по умолчанию, и может быть вызван с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, покрытых в виде кулинарной книги:
Наслаждаться.
4. Идти вперед
Как я упоминал в начале, я экспериментирую с этимdifferent format – the cookbook - чтобы попытаться собрать простые общие задачи использования коллекций Guava в одном месте. Основное внимание в этом формате уделяется простоте и скорости, поэтому большинство рецептов имеютno additional explanation other than the code example itself.
Наконец - я смотрю на это как наa living document - я буду добавлять рецепты и примеры по мере их появления. Не стесняйтесь добавлять в комментарии больше, и я постараюсь включить их в кулинарную книгу.
Реализация всех этих примеров и фрагментов кодаcan be found over on GitHub - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.