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();