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 🙂