Guava-Funktionskochbuch

Guava Functional Cookbook

1. Überblick

Dieses Kochbuch ist insmall and focused recipes and code snippets unterteilt, um die Elemente des Guava-Funktionsstils - Prädikate und Funktionen - zu verwenden.

Dascookbook format ist fokussiert und praktisch - es sind keine überflüssigen Details und Erklärungen erforderlich.

2. Das Kochbuch

Filtern einer Sammlung nach einer Bedingung (benutzerdefiniertes Prädikat)

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));

Nullen aus einer Sammlung herausfiltern

List withNulls = Lists.newArrayList("a", "bc", null, "def");
Iterable withoutNuls = Iterables.filter(withNulls, Predicates.notNull());
assertTrue(Iterables.all(withoutNuls, Predicates.notNull()));

Überprüfen Sie die Bedingung für alle Elemente einer Sammlung

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));

ein Prädikat negieren

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)));

eine einfache Funktion anwenden

List numbers = Lists.newArrayList(1, 2, 3);
List asStrings = Lists.transform(numbers, Functions.toStringFunction());
assertThat(asStrings, contains("1", "2", "3"));

Sortieren Sie die Sammlung, indem Sie zuerst eine Zwischenfunktion anwenden

List numbers = Arrays.asList(2, 1, 11, 100, 8, 14);
Ordering ordering = Ordering.natural().onResultOf(Functions.toStringFunction());
List inAlphabeticalOrder = ordering.sortedCopy(numbers);
List correctAlphabeticalOrder = Lists.newArrayList(1, 100, 11, 14, 2, 8);
assertThat(correctAlphabeticalOrder, equalTo(inAlphabeticalOrder));


komplexes Beispiel - Verketten von Prädikaten und Funktionen

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));

komponiere zwei Funktionen

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));

Erstellen Sie eine Karte, die von einem Set und einer Funktion unterstützt wird

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));

Erstellen Sie eine Funktion aus einem Prädikat

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. Weitere Guaven-Kochbücher

Guava ist eine umfassende und fantastisch nützliche Bibliothek - hier sind einige weitere APIs, die in Kochbuchform behandelt werden:

Genießen.

4. Fazit

Dieses Format unterscheidet sich ein wenig von meinen üblichen Tutorials - hauptsächlich, weil diesan internal development cookbookist, die ich seit einiger Zeit behalte und verwende. Das Ziel ist es, diese Informationen online verfügbar zu machen - und sie zu ergänzen, wenn ich auf ein neues nützliches Beispiel stoße.

Die Implementierung all dieser Beispiele und Codefragmentecan be found over on GitHub - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.