web-dev-qa-db-ja.com

ストリームでNoSuchElementExceptionを回避する

次のStreamがあります。

Stream<T> stream = stream();

T result = stream.filter(t -> {
    double x = getX(t);
    double y = getY(t);
    return (x == tx && y == ty);
}).findFirst().get();

return result;

ただし、次のエラーが発生する結果が常にあるとは限りません。

NoSuchElementException:値がありません

値が存在しない場合、どのようにしてnullを返すことができますか?

43
clankill3r

Optional.orElseisPresentをチェックするよりもずっと簡単です:

T result = stream.filter(t -> {
    double x = getX(t);
    double y = getY(t);
    return (x == tx && y == ty);
}).findFirst().orElse(null);

return result;
79
Tagir Valeev

Stream#findFirst() は、 Optional を返します。これは、null値を操作する必要がないように特別に存在します。

Null以外の値を含む場合と含まない場合があるコンテナオブジェクト。値が存在する場合、isPresent()trueを返し、get()は値を返します。

それ以外の場合、 Optional#get()NoSuchElementExceptionをスローします。

このOptionalに値が存在する場合は値を返し、そうでない場合はNoSuchElementExceptionをスローします。

Optionalの場合、nullは値を公開しません。

本当にする必要がある場合は、isPresent()をチェックしてnullを自分で返します。

Stream<T> stream = stream();

Optional<T> result = stream.filter(t -> {
    double x = getX(t);
    double y = getY(t);
    return (x == tx && y == ty);
}).findFirst();

if (result.isPresent()) 
    return result.get();
return null;
23

_Optional.get_ (NoSuchElementExceptionでユーザーの意図が失敗する可能性が高い)を置き換える代替方法は、JDK10で導入されたより詳細なAPI Optional.orElseThrow()著者の言葉 -

Optional.get()は「魅力的な迷惑行為」であり、プログラマーにとって魅力的であり、頻繁にエラーを引き起こします。 人々は、ゲッターが例外をスローすることを期待していません。同等のセマンティクスを持つOptional.get()の代替APIを追加する必要があります。

Note:-これら両方のAPIの基礎となる実装は同じですが、後者はより明確に読み上げます明示的な代替としてコンシューマが使用する既存の Optional.orElseThrow​(Supplier<? extends X> exceptionSupplier) 実装にインライン化する値が存在しない場合、デフォルトでNoSuchElementExceptionがスローされます。

0
Naman