あなたは古くなった質問をしています。ストリームはソースのすべての要素を処理するため、要素がない場合は何も行われません。したがって、リストが空であるかどうかを確認する必要はありません。
list.stream().filter(Objects::nonNull)
.map(listElement -> listElement.getCandyType())
.forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType));
または
Assert.assertTrue(list.stream().filter(Objects::nonNull)
.map(listElement -> listElement.getCandyType())
.allMatch(Predicate.isEqual(ValueType.CANDY));
allMatch
は、このチェックのために必要な規則に従います。
それでも、あなたはあなたのコードを簡素化することができます。要素がない場合、矛盾する要素はないので、はすべてと一致します。 listElement -> listElement.getCandyType()
は、ClassName::getCandyType
という形式のメソッド参照で置き換えることもできます。私は正しいクラス名を知らないのでここではそれをしなかった。
両方のバリエーションの間にパフォーマンスの違いはありません。 allMatch
は最初の不一致要素に遭遇した直後に戻り、assertEquals
は最初に一致しない要素を投げます。後者の場合、スタックトレースはストリームAPI実装の成果物を表示しません。
ユニットテストではなく、プロダクションコードのチェックを行い、Java言語assert
のように、これらのチェックをオフにすることができます。このフォームとして
assert list.stream().filter(Objects::nonNull)
.map(listElement -> listElement.getCandyType())
.allMatch(Predicate.isEqual(ValueType.CANDY));
forEach
作用をassert
ステートメントを有するアサーションは、第一の変形一方、オフされるオーバーヘッドがないことの保証は依然としてすべての要素を反復処理の中間ステップを実行せてもよいですパイプライン。
あなたのアプローチの欠点は、失敗した場合、元のコードは、 "CANDYは期待されましたが:SHMANDY"のような実際の一致していない値を表示し、コードはアサーションが失敗したと言うだけです。 –
@ Tagir Valeev:私の最初の変種はまだそれを行います。その情報が本当に役立つかどうかは議論の余地がありますが。たぶん索引が役立つかもしれません、多分*他の*一致しない項目、いくつかがある場合...通常、誤った状態につながった歴史はあなたが必要とするものですが、それは何か、どちらの変種も実現できません。 – Holger
ありがとうございます。私はあなたの答えを選択しました。これは非常に明確で、私のコードも改善されました。 –