Jak komentuje Peter Lawrey, to prawie na pewno będzie prostsze jak zagnieżdżonych pętli. Więcej skończy, Guava documentation daje to ostrzeżenie:
kod Imperatyw powinien być domyślnym, pierwszym wyborem jako Java 7. Nie należy używać idiomów funkcjonalne, chyba że jesteś absolutnie pewny jednego z następujących powodów:
- Używanie funkcjonalnych idiomów spowoduje oszczędności netto dla linii kodu dla całego projektu. Przeniesienie definicji funkcji funkcji do innego pliku lub stałej nie pomaga.
- Aby uzyskać wydajność, potrzebny jest leniwie wyliczony widok przekształconej kolekcji i nie można uzyskać rozliczenia dla jawnie wyliczonej kolekcji. Dodatkowo, przeczytałeś i ponownie przeczytałeś Efektywną Javę, poz. 55 i , poza wykonaniem tych instrukcji, wykonałeś testowanie , aby udowodnić, że ta wersja jest szybsza, i możesz przytoczyć numery , aby to udowodnić.
Pamiętaj, przy użyciu narzędzi funkcjonalnych guawy jest, że tradycyjna imperatyw sposób robienia rzeczy nie jest bardziej czytelny. Spróbuj to napisać. Czy to było takie złe? Czy było to łatwiejsze do odczytania niż absurdalnie niezręczne podejście funkcjonalne, o które się starałeś?
Jednakże, jeśli jesteś natarczywe na ignorując rady, można użyć coś jak to monstrum (zauważ, że nie zostały faktycznie starał się skompilować lub uruchomić tego):
FluentIterable.from(continentList)
.transform(new Function<Continent, Void>() {
public Void apply(Continent continent) {
return FluentIterable.from(continent.getCountries())
.transform(new Function<Country, Void>() {
public Void apply(Country country) {
return FluentIterable.from(country.getCities())
.transform(new Function<City, Void>() {
public Void apply(City city) {
// do stuff with city object
return null;
}
});
}
});
}
});
Teraz należy zadać sobie pytanie: Które chciałbyś zachować? Który z nich będzie najbardziej wydajny?
Istnieją ważne przypadki użycia dla idiomu funkcjonalnego Guawy. Zastępowanie Java dla pętli, nawet zagnieżdżonych dla pętli, nie jest jednym z nich.
Można zagnieździć swoje mapowania. IMHO prawdopodobnie będzie prostsze jak pętle zagnieżdżone, przynajmniej dla zewnętrznych pętli. –
W linii 3, nie powinno to być "kontynent.getCountries()"? – Chris
Możesz użyć guavas "transformacja" i "concat", aby utworzyć pojedynczą listę trzech kontynentów, kontynentu, miasta, miasta, a następnie powtórz to, ale przynajmniej z Javą 7 kod będzie raczej brzydki. Zostałbym z zagnieżdżonymi pętlami. – Chris