Mam poniższy fragment kodu.Jak iterować zagnieżdżone dla pętli odnoszące się do elementów nadrzędnych za pomocą Java 8 Streams i Lambdas?
public static ModuleKey getDeployableModuleFromModulesList(List<Module> modules) {
ModuleKey deployableModuleKey = null;
for(Module module : modules) {
List<Artifact> artifacts = module.getArtifacts();
for(Artifact artifact : artifacts) {
if(artifact.getType().equals("ear")) {
return module.getKey();
} else if(!artifact.getType().equals("ear")) {
if(artifact.getType().equals("war")) {
deployableModuleKey = module.getKey();
}
}
}
}
return deployableModuleKey;
}
Kod ten znajduje pierwsze '' z deployableModuleKey key = 'ucho' czy ostatni z key = 'wojna'. Chcę uzyskać tę samą funkcjonalność co powyżej, używając strumieni Java 8 i Lambdas.
tej pory co próbowałem to:
modules.stream().flatMap(e -> e.getArtifacts().stream())
.filter(e -> e.getType().equals("ear")).findFirst()
.orElseGet(() -> modules.stream().flatMap(e -> e.getArtifacts().stream())
.filter(e -> e.getType().equals("war")).reduce((a, b) -> b).orElse(null));
Powyższy fragment kodu zwróci obiekt typu Artifact
zamiast Module
. Chcę uzyskać ten moduł, w którym artefakt pasuje do warunków. Po znalezieniu modułu mogę zwrócić klucz, wykonując module.getKey()
. Aby to zrobić, chciałbym wiedzieć, w jaki sposób odsyła się elementy pętli rodzica.
Nie jestem pewien, czy mój kod Java 8 jest całkowicie poprawny.
Czy ktoś może mi pomóc w tym zakresie?
Proponuję podzielić ten proces na kilka funkcji. Nie oznacza to, że strumienie Java 8 nie są zachęcane do łączenia operacji, ale do tego, aby były jak najbardziej klarowne i atomowe. –
Wątpię, czy używanie strumieni jest lepsze niż rzeczywisty kod. Strumienie nie nadają się do utrzymywania stanu między operacjami pośrednimi. Dodatkowo twój aktualny kod powoduje przejście przez wszystkie artefakty, podczas gdy proponowane rozwiązania powodują dwa przejścia. Jeśli chcesz zrobić to za pomocą tylko jednego przebiegu, sugeruję utworzenie własnego kolekcjonera (jest tu wiele pytań na temat tworzenia kolektorów, wybierz jedną i kontynuuj od tego) –