【发布时间】:2017-02-07 02:48:25
【问题描述】:
我有以下代码。
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;
}
此代码查找 key='ear' 的第一个 'deployableModuleKey' 或 key = 'war' 的最后一个。 我想使用 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));
上面的代码 sn-p 将返回一个 Artifact 类型的对象,而不是 Module。我想获得工件与条件匹配的那个模块。找到模块后,我可以通过 module.getKey() 返回密钥。
为此,我想知道我们如何引用父 for 循环的元素。
我不确定我的 Java 8 代码是否完全正确。
有人可以在这方面帮助我吗?
【问题讨论】:
-
我建议您将这个过程分解为几个函数。这并不意味着不鼓励 Java 8 流链接操作,而是尽可能使它们清晰和原子。
-
我怀疑使用流比你的实际代码更好。流不适合在中间操作之间保持状态。另外,您当前的代码通过所有工件一次通过,而提议的解决方案通过两次。如果您只想通过一次完成此操作,我建议您创建自己的收集器(这里有很多关于创建收集器的问题,只需选择一个并从那里继续)
标签: lambda java-8 java-stream