Livro de receitas funcional da goiaba
1. Visão geral
Este livro de receitas está organizado emsmall and focused recipes and code snippets para usar os elementos de estilo funcional Guava - Predicados e Funções.
Ocookbook format é focado e prático - sem detalhes estranhos e explicações necessárias.
2. The Cookbook
filtrar uma coleção por uma condição (predicado personalizado)
List numbers = Lists.newArrayList(1, 2, 3, 6, 10, 34, 57, 89);
Predicate acceptEven = new Predicate() {
@Override
public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
List evenNumbers = Lists.newArrayList(Collections2.filter(numbers, acceptEven));
Integer found = Collections.binarySearch(evenNumbers, 57);
assertThat(found, lessThan(0));
filtrar nulos de uma coleção
List withNulls = Lists.newArrayList("a", "bc", null, "def");
Iterable withoutNuls = Iterables.filter(withNulls, Predicates.notNull());
assertTrue(Iterables.all(withoutNuls, Predicates.notNull()));
verificar condição para todos os elementos de uma coleção
List evenNumbers = Lists.newArrayList(2, 6, 8, 10, 34, 90);
Predicate acceptEven = new Predicate() {
@Override
public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
assertTrue(Iterables.all(evenNumbers, acceptEven));
negar um predicado
List evenNumbers = Lists.newArrayList(2, 6, 8, 10, 34, 90);
Predicate acceptOdd = new Predicate() {
@Override
public boolean apply(Integer number) {
return (number % 2) != 0;
}
};
assertTrue(Iterables.all(evenNumbers, Predicates.not(acceptOdd)));
aplique uma função simples
List numbers = Lists.newArrayList(1, 2, 3);
List asStrings = Lists.transform(numbers, Functions.toStringFunction());
assertThat(asStrings, contains("1", "2", "3"));
classificar coleção aplicando primeiro uma função intermediária
List numbers = Arrays.asList(2, 1, 11, 100, 8, 14);
Ordering
exemplo complexo - encadeando predicados e funções
List numbers = Arrays.asList(2, 1, 11, 100, 8, 14);
Predicate acceptEvenNumber = new Predicate() {
@Override
public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
Function powerOfTwo = new Function() {
@Override
public Integer apply(Integer input) {
return (int) Math.pow(input, 2);
}
};
FluentIterable powerOfTwoOnlyForEvenNumbers =
FluentIterable.from(numbers).filter(acceptEvenNumber).transform(powerOfTwo);
assertThat(powerOfTwoOnlyForEvenNumbers, contains(4, 10000, 64, 196));
compor duas funções
List numbers = Arrays.asList(2, 3);
Function powerOfTwo = new Function() {
@Override
public Integer apply(Integer input) {
return (int) Math.pow(input, 2);
}
};
List result = Lists.transform(numbers,
Functions.compose(powerOfTwo, powerOfTwo));
assertThat(result, contains(16, 81));
criar um mapa apoiado por um conjunto e uma função
Function powerOfTwo = new Function() {
@Override
public Integer apply(Integer input) {
return (int) Math.pow(input, 2);
}
};
Set lowNumbers = Sets.newHashSet(2, 3, 4);
Map numberToPowerOfTwoMuttable = Maps.asMap(lowNumbers, powerOfTwo);
Map numberToPowerOfTwoImuttable = Maps.toMap(lowNumbers, powerOfTwo);
assertThat(numberToPowerOfTwoMuttable.get(2), equalTo(4));
assertThat(numberToPowerOfTwoImuttable.get(2), equalTo(4));
criar uma função a partir de um predicado
List numbers = Lists.newArrayList(1, 2, 3, 6);
Predicate acceptEvenNumber = new Predicate() {
@Override
public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
Function isEventNumberFunction = Functions.forPredicate(acceptEvenNumber);
List areNumbersEven = Lists.transform(numbers, isEventNumberFunction);
assertThat(areNumbersEven, contains(false, true, false, true));
3. Mais livros de receitas de goiaba
Guava é uma biblioteca abrangente e fantasticamente útil - aqui estão mais algumas APIs abordadas na forma de livro de receitas:
Desfrutar.
4. Conclusão
Este formato é um pouco diferente dos meus tutoriais habituais - principalmente porque se trata dean internal development cookbook que mantenho e utilizo há algum tempo. O objetivo é ter essas informações prontamente disponíveis on-line - e adicioná-las sempre que encontrar um novo exemplo útil.
A implementação de todos esses exemplos e trechos de códigocan be found over on GitHub - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.