1. Обзор
Эта кулинарная книга состоит из небольших и целенаправленных рецептов и фрагментов кода для использования элементов функционального стиля Guava — предикатов и функций.
Формат кулинарной книги сфокусирован и практичен – никаких лишних деталей и объяснений не требуется.
2. Поваренная книга
фильтровать коллекцию по условию (настраиваемый предикат)
List<Integer> numbers = Lists.newArrayList(1, 2, 3, 6, 10, 34, 57, 89);
Predicate<Integer> acceptEven = new Predicate<Integer>() {
@Override
public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
List<Integer> evenNumbers = Lists.newArrayList(Collections2.filter(numbers, acceptEven));
Integer found = Collections.binarySearch(evenNumbers, 57);
assertThat(found, lessThan(0));
отфильтровать нули из коллекции
List<String> withNulls = Lists.newArrayList("a", "bc", null, "def");
Iterable<String> withoutNuls = Iterables.filter(withNulls, Predicates.notNull());
assertTrue(Iterables.all(withoutNuls, Predicates.notNull()));
проверить условие для всех элементов коллекции
List<Integer> evenNumbers = Lists.newArrayList(2, 6, 8, 10, 34, 90);
Predicate<Integer> acceptEven = new Predicate<Integer>() {
@Override
public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
assertTrue(Iterables.all(evenNumbers, acceptEven));
отрицать предикат
List<Integer> evenNumbers = Lists.newArrayList(2, 6, 8, 10, 34, 90);
Predicate<Integer> acceptOdd = new Predicate<Integer>() {
@Override
public boolean apply(Integer number) {
return (number % 2) != 0;
}
};
assertTrue(Iterables.all(evenNumbers, Predicates.not(acceptOdd)));
применить простую функцию
List<Integer> numbers = Lists.newArrayList(1, 2, 3);
List<String> asStrings = Lists.transform(numbers, Functions.toStringFunction());
assertThat(asStrings, contains("1", "2", "3"));
отсортировать коллекцию, сначала применив промежуточную функцию
List<Integer> numbers = Arrays.asList(2, 1, 11, 100, 8, 14);
Ordering<Object> ordering = Ordering.natural().onResultOf(Functions.toStringFunction());
List<Integer> inAlphabeticalOrder = ordering.sortedCopy(numbers);
List<Integer> correctAlphabeticalOrder = Lists.newArrayList(1, 100, 11, 14, 2, 8);
assertThat(correctAlphabeticalOrder, equalTo(inAlphabeticalOrder));
сложный пример — цепочка предикатов и функций
List<Integer> numbers = Arrays.asList(2, 1, 11, 100, 8, 14);
Predicate<Integer> acceptEvenNumber = new Predicate<Integer>() {
@Override
public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
Function<Integer, Integer> powerOfTwo = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer input) {
return (int) Math.pow(input, 2);
}
};
FluentIterable<Integer> powerOfTwoOnlyForEvenNumbers =
FluentIterable.from(numbers).filter(acceptEvenNumber).transform(powerOfTwo);
assertThat(powerOfTwoOnlyForEvenNumbers, contains(4, 10000, 64, 196));
составить две функции
List<Integer> numbers = Arrays.asList(2, 3);
Function<Integer, Integer> powerOfTwo = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer input) {
return (int) Math.pow(input, 2);
}
};
List<Integer> result = Lists.transform(numbers,
Functions.compose(powerOfTwo, powerOfTwo));
assertThat(result, contains(16, 81));
создать карту, поддерживаемую набором и функцией
Function<Integer, Integer> powerOfTwo = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer input) {
return (int) Math.pow(input, 2);
}
};
Set<Integer> lowNumbers = Sets.newHashSet(2, 3, 4);
Map<Integer, Integer> numberToPowerOfTwoMuttable = Maps.asMap(lowNumbers, powerOfTwo);
Map<Integer, Integer> numberToPowerOfTwoImuttable = Maps.toMap(lowNumbers, powerOfTwo);
assertThat(numberToPowerOfTwoMuttable.get(2), equalTo(4));
assertThat(numberToPowerOfTwoImuttable.get(2), equalTo(4));
создать функцию из предиката
List<Integer> numbers = Lists.newArrayList(1, 2, 3, 6);
Predicate<Integer> acceptEvenNumber = new Predicate<Integer>() {
@Override
public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
Function<Integer, Boolean> isEventNumberFunction = Functions.forPredicate(acceptEvenNumber);
List<Boolean> areNumbersEven = Lists.transform(numbers, isEventNumberFunction);
assertThat(areNumbersEven, contains(false, true, false, true));
3. Больше поваренных книг по гуаве
Guava — это всеобъемлющая и фантастически полезная библиотека — вот еще несколько API, представленных в форме поваренной книги:
Поваренная книга заказа гуавы
Поваренная книга коллекций гуавы
Наслаждаться.
4. Вывод
Этот формат немного отличается от моих обычных руководств — в основном потому, что это внутренняя кулинарная книга по разработке , которую я храню и использую в течение достаточно долгого времени. Цель состоит в том, чтобы эта информация была легко доступна в Интернете и добавлялась к ней каждый раз, когда я сталкивался с новым полезным примером.
Реализацию всех этих примеров и фрагментов кода можно найти на GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.