web-dev-qa-db-ja.com

Java 8でリストが空かどうかを確認する

私はJava8が初めてです。リストとフィルターを実装しました。コードでnullチェックを実行しました。同じコードスニペットでリストが空でないかどうかを確認する方法について、いくつかの助けをいただければ幸いです。リストが空でない場合、コードはアサーションを続行する必要があります。

    list.stream().filter(listElement -> listElement != null).
    forEach((listElement) -> Assert.assertEquals(
        ValueType.CANDY,
        listElement.getCandyType()));
12
Drools_user

時代遅れの質問をしています。ストリームはソースのすべての要素を処理するため、要素がない場合、アクションは実行されません。したがって、リストが空かどうかを確認する必要はありません。

それでも、コードを簡素化できます。

_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ステートメントを持つ最初のバリアントは、すべての要素を反復して中間処理を実行します。パイプラインのステップ。

21
Holger

選択した答えは素晴らしいです。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)););
13
Johnny

isEmptyメソッドを確認してください

if (list.isEmpty()) { ... }

ドキュメントは次のとおりです。 https://docs.Oracle.com/javase/7/docs/api/Java/util/List.html#isEmpty()

7
Buddy

リストが空であると断定することは、リストの特定の要素が何らかの形式を持っていることを断定することとは別のことです(つまり、getCandyType() == ValueType.CANDY)。 2つのアイデアを結びつけることは、物事を行う正しい方法ではありません。

必要なことは、forEachの前または後に2番目のアサーションを追加することです。

assertThat(list.isEmpty(), not(equalTo(Boolean.FALSE)))

...または同様のもの。

空のリストに関する主なポイントの1つは、要素を含むリストと同じ方法で処理できることです。 オプションのクラスNullパターン のようなものが存在するのはこのためです。そのため、リストが空であることを本当に気にする場合は、本当にshouldを別個の明確なアサーションにします。

1
sisyphus