2017-02-01 3 views
-1

У меня есть код ниже.Java 8 Лямбда и потоки

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?

+7

Вы должны, по крайней мере, сделать усилие ... Попробуйте сделать это и покажите нам, где вы застреваете! Так вы учите брата! – alfasin

+0

текущая реализация может вернуть null. Нехорошо. рассмотрите возможность возврата необязательно . Или возможно ModuleKey.NONE (специальный нулевой объект). Также вы всегда возвращаете либо module.getKey(), либо null. Для lambdas псевдокод - это 'return module.getArtifacts(). Stream(). Map (module-> module.getKey()). Map (key -> null или key)' –

ответ

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

Update на 2/8, если вы не возражаете, используя свою библиотеку: AbacusUtil, код может быть упрощен:

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

Приятно, что вы нашли несогласованности в старой импликации! – keuleJ

+0

Спасибо @ user3380739. Я хочу второй случай. –

+0

Когда я использую второй код, компилятор бросает две ошибки. Один из них: 'Метод orElseGet (поставщик ) в типе Необязательный не применим для аргументов (() -> {})', а другая ошибка: 'Метод findLast() не определен для типа Поток '. –