私はJava8が初めてです。リストとフィルターを実装しました。コードでnullチェックを実行しました。同じコードスニペットでリストが空でないかどうかを確認する方法について、いくつかの助けをいただければ幸いです。リストが空でない場合、コードはアサーションを続行する必要があります。
list.stream().filter(listElement -> listElement != null).
forEach((listElement) -> Assert.assertEquals(
ValueType.CANDY,
listElement.getCandyType()));
時代遅れの質問をしています。ストリームはソースのすべての要素を処理するため、要素がない場合、アクションは実行されません。したがって、リストが空かどうかを確認する必要はありません。
それでも、コードを簡素化できます。
_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
は最初の不一致要素をスローします。 2番目の場合、スタックトレースには、ストリームAPI実装のアーティファクトは表示されません。
Java Language assert
機能のように、単体テストではなく本番コードのチェックを提供し、これらのチェックをオフにできる場合は、2番目の方法が推奨されます。
_assert list.stream().filter(Objects::nonNull)
.map(listElement -> listElement.getCandyType())
.allMatch(Predicate.isEqual(ValueType.CANDY));
_
この形式は、アサーションがオフになったときにオーバーヘッドがないことを保証しますが、assert
アクションを持つforEach
ステートメントを持つ最初のバリアントは、すべての要素を反復して中間処理を実行します。パイプラインのステップ。
選択した答えは素晴らしいです。Java8Optionalクラスに新しく導入された のOptional.ofNullable
でnullケースを処理するための小さな提案です :
Optional.ofNullable(list)
.orElseGet(Collections::emptyList)
.stream().filter(Objects::nonNull)
.map(listElement -> listElement.getCandyType())
.forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType)););
isEmpty
メソッドを確認してください
if (list.isEmpty()) { ... }
ドキュメントは次のとおりです。 https://docs.Oracle.com/javase/7/docs/api/Java/util/List.html#isEmpty()
リストが空であると断定することは、リストの特定の要素が何らかの形式を持っていることを断定することとは別のことです(つまり、getCandyType() == ValueType.CANDY
)。 2つのアイデアを結びつけることは、物事を行う正しい方法ではありません。
必要なことは、forEach
の前または後に2番目のアサーションを追加することです。
assertThat(list.isEmpty(), not(equalTo(Boolean.FALSE)))
...または同様のもの。
空のリストに関する主なポイントの1つは、要素を含むリストと同じ方法で処理できることです。 オプションのクラス や Nullパターン のようなものが存在するのはこのためです。そのため、リストが空であることを本当に気にする場合は、本当にshouldを別個の明確なアサーションにします。