2017-05-02 6 views
3

私は3つのクラス、すなわちエンジン、ホイール、オートモービルを持っています。次のようにこれらのクラスの内容は以下のとおりです。 -ブール値をJava 8ストリームに返すネストされたforループを変換しますか?

class Engine { 
    String modelId; 
} 

class Wheel { 
    int numSpokes; 
} 

class AutoMobile { 
     String make; 
     String id; 
} 

私はList<Engine>List<Wheel>と私はを反復処理し、特定の条件をチェックする必要がList<Automobile>を持っています。この条件を満たすエンティティが1つ存在する場合は、真を返す必要があります。それ以外の場合はfalseを返します。次のように

機能は次のとおりです。

Boolean validateInstance(List<Engine> engines, List<Wheel> wheels , List<AutoMobile> autoMobiles) { 
    for(Engine engine: engines) { 
     for(Wheel wheel : wheels) { 
      for(AutoMobile autoMobile : autoMobiles) { 
       if(autoMobile.getMake().equals(engine.getMakeId()) && autoMobile.getMaxSpokes() == wheel.getNumSpokes() && ....) { 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 

私は今、この

試してみた
return engines.stream() 
     .map(engine -> wheels.stream() 
      .map(wheel -> autoMobiles.stream() 
       .anyMatch(autoMobile -> {---The condition---}))); 

まで私が(マップを知っている必要があり)、使用する適切な機能ではありません。私はこのシナリオをどのように解決するかについて迷っています。私は、APIのドキュメントを通過し、forEach()の結果を試してみました。私はreduce()APIを使いましたが、使い方がわかりません

私はマップがあるストリームを別のストリームに変換することを知っています。誰もこのシナリオを解決する方法を提案することはできますか?

+2

あなたのクラスがいくつかのフィールドを欠場するようです。例が正しいと確信していますか? – Eugene

+0

@Eugene、これはプロジェクト全体の小さなスナップショットです。読みやすさを高めるために多くのプロパティをカプセル化しています。 – Echo

+1

これで、* testable *の例になります。私たちはここで推測しています...実際に*正確な条件が欲しいと確信していますか?* – Eugene

答えて

-1

Mapではなく、flatMapを使用する必要があります。

+1

Flatmapは 'Stream'を返します。関数の戻り値の型は 'boolean'です。 – marstran

+0

彼はすでにanymatchを使用してストリームからブール値を取得しています。それは彼が助けが必要な部分ではありません。 –

+1

彼の問題は、彼が 'Stream >>'を得ることですが、彼は 'Boolean'を望んでいます。 – marstran

5

あなたが巣Stream::anyMatch必要があります。

return engines.stream() 
    .anyMatch(engine -> wheels.stream() 
     .anyMatch(wheel -> autoMobiles.stream() 
      .anyMatch(autoMobile -> /* ---The condition--- */))); 
+0

議論のように、次のことが起こります: - innerMost anyMatchは条件をチェックし、条件が一致すると真を返します。 2番目のanyMatchは、内部ブロックからtrueをチェックし、ホイールの瞬間に真がある場合は真を返し、それが反復的に外側に戻り、最後にtrueまたはfalseを返します。私の前提が正しければ論理を開発するのに役立つので、コメントしてください。 – Echo

+2

@Echo 'Stream :: anyMatch'は短絡端末操作です。最も内側の 'anyMatch'が一致する場合は、入れ子になっているforループのreturn文のように最も外側に伝播します。 – Flown

+0

他の2つのanyMatchが必要なのはなぜですか?このコードのすべての要素(トリプルネストされたループ、条件チェック、返り値のブール値など)が同じであれば、他の方法(最適化された、またはより論理的に健全な)がありますか? – Echo

関連する問題