Java 8 Lambda和Streams

时间:2017-02-01 18:21:36

标签: lambda java-8 java-stream

我有下面的代码。

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;
    }

如何使用Java 8的lambda和流来实现这一目标?

1 个答案:

答案 0 :(得分:4)

我可能误解了这个问题:如果您正在寻找带有'deployableModuleKey'key='ear'的第一个'war'

modules.stream().flatMap(e -> e.getArtifacts().stream())
  .filter(e -> e.getType().equals("ear") || e.getType().equals("war"))
  .findFirst().orGet(null);

如果您想查找带'deployableModuleKey'的第一个key='ear'或带key = 'war'的最后一个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); } 。可能需要两个陈述:

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

2月8日更新,如果你不介意使用我的库:AbacusUtil,代码可以简化为:

var values = {
    4: { color: 'green', title: 'Ok' },
    3: { color: 'green', title: 'Ok' },
    0: { color: 'red', title: 'Bad' },
    default: { color: 'orange', title: 'Average' }
};