У меня есть код ниже.Как перебирать вложенные петли, ссылаясь на родительские элементы, используя Java 8 Streams и 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;
}
Этот код находит первый «deployableModuleKey» с ключом = «ухо» или последнего с ключом = «войны». Я хочу достичь той же функциональности, что и выше, используя Java 8 Streams и Lambdas.
До сих пор, что я попытался это:
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));
выше фрагмент кода будет возвращать объект типа Artifact
вместо Module
. Я хочу получить тот модуль, где артефакт соответствует условиям. Как только я нахожу модуль, я могу вернуть ключ, выполнив module.getKey()
. Для этого я хотел бы знать, как мы ссылаемся на элементы родительского цикла.
Я не уверен, что мой код Java 8 полностью верен.
Может ли кто-нибудь помочь мне в этом отношении?
Я предлагаю вам разбить этот процесс на несколько функций. Это не означает, что потоки Java 8 не поощряются к цепочки операций, но чтобы сделать их ясными и атомными как можно больше. –
Я сомневаюсь, что использование потоков лучше, чем ваш фактический код. Потоки не подходят для хранения состояния между промежуточными операциями. Кроме того, ваш текущий код пропускает все артефакты, а предлагаемые решения делают два прохода. Если вы хотите сделать это только за один проход, я предлагаю вам создать свой собственный коллекционер (есть много вопросов о создании коллекционеров здесь, просто выберите один и продолжить оттуда) –