2017-02-03 16 views
2

私は既存のコードを持っていると私はJava8が提供するストリームに変換するために探していますストリーム私はそれを書くかもしれない方法があるヘルプ学習のJava 8は

+0

は、私には罰金になります。私たちは、Predicate.orメソッドを使用して、ここでいくつかのPredicates組み合わせている

Details.stream() .filter(Objects::nonNull) .map(Person::getPersonChild) .filter(Objects::nonNull) .anyMatch( ((Predicate<String>) Child::isAB). or(Child::isBC). or(Child::isDE). or(Child::isEF) ); 

。なぜあなたは 'getName'をチェックしますが、' getPersonChild'を参照するのはなぜ、それが 'null'かどうかをチェックしないのですか? –

+2

'isABCDEF()'メソッドを追加できますか? –

+0

はいごめんなさい...悪い... PersonChildのnullチェックがありました – Hali

答えて

4

ため、この

感謝を達成するために

return Details.stream() 
      .filter(p -> null != p) 
      .map(Person::getPersonChild) 
      .filter(pc -> null != pc) 
      .anyMatch(pc -> pc.isABCEDF()); 

ここで、isABCDEFはすべての条件をチェックします。

方法は

を追加することはできませんまたはあなたはそれがチェックされているものをよりよく説明し、このメソッドを追加することができていません。

.anyMatch(pc -> isABCEDF(pc)); 

あなたは@WanderNautaが指摘するように、あなたはこれが明確であると感じた場合、あなたもnullチェックのため.filter(Objects::nonNull)を使用することができます

.anyMatch(c -> c.isAB() || c.isBC() || c.isCD() || c.idDE() || c.isEF()); 

を示唆したものを行うことができます方法を追加しない場合。

+2

または最後の 'filter'を' anyMatch': 'Details.stream()。filter(Objects :: nonNull).map(Person :: getPersonChild).anyMatch(PC - >ヌル!= PC && PC)と融合させます。 isABCEDF()) ' – Holger

+0

modList.stream()。(詳細 - >ヌルをフィルタリングする!=詳細&&ヌル!= details.getPersonChild()) \t \t \t \t \t \tの.map(人:: getPersonChild) \t \t \t \t \t \t .anyMatch((Child :: isAB || Child :: isBC || Child :: isCD || Child.isDE || Child :: isEF)); --- >> Child :: isAB || ....と書くとエラーになるそれは機能的なインターフェイスであると言います – Hali

+0

正確なエラーです。この式のターゲットタイプは、anyMatch((Child :: isAB || Child :: isBC || Child :: isCD || Childの下の機能的なインターフェイスと赤い線でなければなりません。 isDE ||子:: isEF)); – Hali

3

他の解決策は以下のとおりです。

((Predicate<String>) Child::isAB).or(Child::isBC).or(Child::isDE).or(Child::isEF) 
関連する問題