Перейти к основному содержимому

Поваренная книга коллекций гуавы

· 4 мин. чтения

Задача: Сумма двух

Дано массив целых чисел и целая сумма. Нужно найти индексы двух чисел, сумма которых равна заданной ...

ANDROMEDA

1. Введение

Эта статья кулинарной книги состоит из небольших и целенаправленных рецептов и фрагментов кода для использования коллекций в стиле Guava.

Формат представляет собой растущий список примеров кода без необходимости дополнительных объяснений — он предназначен для обеспечения легкого доступа к общим использованиям API во время разработки.

2. Рецепты

понизить List<Parent> до List<Child>

  • примечание : это обходной путь для нековариантных генерируемых коллекций в Java. **

    **

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

более простая альтернатива без гуавы - включает 2 операции приведения

List<Number> originalList = Lists.newArrayList();
List<Integer> theList = (List<Integer>) (List<? extends Number>) originalList;

добавление итерации в коллекцию

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

**проверить, содержит ли коллекция элементы в соответствии с пользовательским правилом сопоставления

**

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

альтернативное решение через поиск

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

альтернативное решение применимо только к наборам

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

NoSuchElementException для Iterables.find , когда ничего не найдено

Iterable<String> theCollection = Sets.newHashSet("abcd", "efgh", "ijkl");
Predicate<String> inputOfLengthOne = new Predicate<String>() {
@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)

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

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

удалить все нулевые значения из коллекции

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

создать неизменяемый список/набор/карту напрямую

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

создать неизменяемый список/набор/карту из стандартной коллекции

List<String> muttableList = Lists.newArrayList();
ImmutableList<String> immutableList = ImmutableList.copyOf(muttableList);

Set<String> muttableSet = Sets.newHashSet();
ImmutableSet<String> immutableSet = ImmutableSet.copyOf(muttableSet);

Map<String, String> muttableMap = Maps.newHashMap();
ImmutableMap<String, String> imuttableMap = ImmutableMap.copyOf(muttableMap);

альтернативное решение с использованием строителей

List<String> muttableList = Lists.newArrayList();
ImmutableList<String> immutableList =
ImmutableList.<String> builder().addAll(muttableList).build();

Set<String> muttableSet = Sets.newHashSet();
ImmutableSet<String> immutableSet =
ImmutableSet.<String> builder().addAll(muttableSet).build();

Map<String, String> muttableMap = Maps.newHashMap();
ImmutableMap<String, String> imuttableMap =
ImmutableMap.<String, String> builder().putAll(muttableMap).build();

3. Больше поваренных книг по гуаве

Guava — это всеобъемлющая и фантастически полезная библиотека — вот еще несколько API, представленных в форме поваренной книги:

Поваренная книга заказа гуавы

Функциональная поваренная книга гуавы

Наслаждаться.

4. Движение вперед

Как я упоминал в начале, я экспериментирую с этим другим форматом — поваренной книгой — чтобы попытаться собрать простые общие задачи по использованию коллекций гуавы в одном месте. Основное внимание в этом формате уделяется простоте и скорости, поэтому большинство рецептов не имеют дополнительных объяснений, кроме самого примера кода .

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

Реализацию всех этих примеров и фрагментов кода можно найти на GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.