Java 8 Lambda和Streams
我有下面的代码Java 8 Lambda和Streams,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我有下面的代码 public static ModuleKey getDeployableModuleFromModulesList(List<Module> modules) { ModuleKey deployableModuleKey = null; for(Module module : modules) { List<Artifact> artifacts = module.getArtifacts();
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 getDeployableModuleFrommoduleList(列出模块){
ModuleKey可部署ModuleKey=null;
用于(模块:模块){
List artifacts=module.getArtifacts();
for(工件工件:工件){
if(artifact.getType().equals(“ear”)){
返回模块.getKey();
}else如果(!artifact.getType().equals(“ear”)){
if(artifact.getType().equals(“war”)){
deployableModuleKey=module.getKey();
}
}
}
}
返回可部署ModuleKey;
}
如何使用Java8的lambda和streams实现这一点?我可能会误解问题:如果您正在寻找第一个
“deployableModuleKey”
并使用key='ear'
或'war'
:
modules.stream().flatMap(e -> e.getArtifacts().stream())
.filter(e -> e.getType().equals("ear") || e.getType().equals("war"))
.findFirst().orGet(null);
如果要使用key='ear'
查找第一个'deployableModuleKey'
,或使用key='war'
查找最后一个'deployableModuleKey'
。可能需要两种陈述:
public static ModuleKey getDeployableModuleFromModulesList(List<Module> modules) {
Optional<ModuleKey> op = modules.stream().filter(m -> m.getArtifacts().stream().anyMatch(e -> e.getType().equals("ear"))).map(m -> m.getKey())
.findFirst();
if (!op.isPresent()) {
op = modules.stream().filter(m -> m.getArtifacts().stream().anyMatch(e -> e.getType().equals("war"))).map(m -> m.getKey()).reduce((a, b) -> b);
}
return op.orElse(null);
}
你至少应该努力。。。试着去做,告诉我们你在哪里被卡住了!兄弟,你就是这样学的!当前实现可以返回null。不好的。考虑返回可选。或者ModuleKey.NONE(特殊的空对象)。此外,始终返回module.getKey()或null。对于lambdas,伪代码是
return module.getArtifacts().stream().map(module->module.getKey()).map(key->null或key)
Nice,您发现了旧impl中的不一致性!谢谢@user3380739。我想要第二种情况。当我使用第二种代码时,编译器抛出两个错误。一种是orElseGet方法(供应商抱歉,我忘记了“findLast”方法仅在我自己的AbacusUtil库中受支持。请更新答案以将“findLast”替换为“reduce”您能为您的代码片段提供一些解释吗?此外,您的代码返回的对象类型为工件
。但它想返回模块
类型的对象。如何返回我会那样做吗?
Stream.of(modules).findFirstOrLast(
m -> m.getArtifacts().stream().anyMatch(e -> e.getType().equals("ear")),
m -> m.getArtifacts().stream().anyMatch(e -> e.getType().equals("war"))).orNull();