Złe pomysły to czasami jedyne pomysły
Guava w swojej funkcyjnej odsłonie jest opłacalna jedynie tam gdzie nie mamy do dyspozycji Javy 8. W tym starciu Guava jest bezbronna ponieważ ma uboższe API i nie ma w nim wielu podstawowych elementów np. konsumentów. Co prawda można ich dopisać, ale to zawsze jest jakiś hak.
Innym, nowym, elementem wprowadzonym w Javie 8, który powoduje, że konstrukcje Guavowe wydają się koślawe jest Method Ref, czyli jedna z form wyrażeń lambda. bez tej konstrukcji jesteśmy skazani na tworzenie klas potworków tylko po to by móc użyć ich w ramach FluentIterable
Na przykładzie
Mamy listę osób należy wypisać imiona kobiet. W Javie 8 napisałbym to tak:
Listing 1. Rozwiązanie z J8
public class BadThingsApp {
public static void main(String[] args) {
ArrayList<Person> persons = newArrayList(
new Person("Ala"),
new Person("Ania"),
new Person("Zenon"),
new Person("Gustawa"));
persons.stream()
.map(Person::name)
.filter(n -> n.lastIndexOf('a') == n.length() - 1)
.forEach(System.out::println);
}
}
Wywołanie map w bardzo przyjemny sposób wybiera nam imiona z klasy Person. Podobnie użycie Method Ref do wypisania imion. Teraz to samo w Guavie BEZ użycia konstrukcji z J8.
Listing 2. Rozwiązanie z Guavą
public class BadThingsApp {
public static void main(String[] args) {
ArrayList<Person> persons = newArrayList(
new Person("Ala"),
new Person("Ania"),
new Person("Zenon"),
new Person("Gustawa"));
FluentIterable.from(persons)
.transform(new Function<Person, String>() {
@Override
public String apply(Person input) {
return input.name();
}
})
.filter(new Predicate<String>() {
@Override
public boolean apply(String input) {
return input.lastIndexOf('a') == input.length() - 1;
}
})
.transform(new Function<String, String>() {
@Override
public String apply(String input) {
System.out.println(input);
return input;
}
}).size();
}
}
Mamy tu trzy dodatkowe klasy anonimowe. Nawet po wyrzuceniu ich do jakiś metod statycznych w ramach klasy Person (pierwsza) i ogólnego konsumenta albo loggera (trzecia) nie będzie to wyglądać zbyt przyjaźnie. W dodatku powiążemy klasę modelu z Guavą. Predykat też jest taki jakiś koślawy… Niestety takie życie.
Podsumowanie
Wcześniejsze wersje języka java posiadały dużo ograniczeń. Guava starała się temu zaradzić, ale była to tylko proteza. Dlaczego o tym dziś napisałem? Ponieważ w fabryce zarzucono mi iż nadużywam funkcyjnych idiomów z Guavy co powoduje, że powstaje wiele klas.
Cóż mogę powiedzieć. Komuś przeszkadza kilka klas, a jednocześnie nie przeszkadzają może nie ośmiotysięczniki, ale solidne klasy tatrzańskie (takie po 1800-2500 linii). Ech…
Jeżeli spodobał ci się wpis podziel się nim z innymi za pomocą przycisków poniżej 🙂