2017-02-01 19 views
-1

私は以下のコードを持っています。Java 8のラムダとストリーム

Java 8のラムダとストリームを使用してこれを実現するにはどうすればよいですか?

+7

あなたは、少なくともANを行う必要があります努力...それをやろうとし、あなたが立ち往生しているところを教えてください!それはあなたが兄弟を学ぶ方法です! – alfasin

+0

現在の実装はnullを返すことができます。良くない。オプションを返すことを検討してください。またはModuleKey.NONE(特別なnullオブジェクト)。 また、常にmodule.getKey()またはnullのいずれかを返します。 ラムダの場合、擬似コードは 'return module.getArtifacts()。stream()。map(module-> module.getKey())。map(key - > nullまたはkey)です。 ' –

答えて

4

私は質問を誤解して:あなたはkey='ear''war'との最初の'deployableModuleKey'を探している場合:

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

あなたはkey = 'war'key='ear'または最後と最初'deployableModuleKey'を検索する場合。おそらく二つの文が必要とされています2/8に

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

アップデートを、あなたは私のライブラリを使用して気にしない場合: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。私は第2の場合が欲しい。 –

+0

2番目のコードを使用しているとき、コンパイラは2つのエラーを投げています。 1つは、タイプ「オプション」のメソッドorElseGet(Supplier <?extends Artifact>)は引数(() - > {}) 'には適用されず、もう1つのエラーは'メソッドfindLastストリーム ' –