次の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
を返すことができますか?
Optional.orElse
、isPresent
をチェックするよりもずっと簡単です:
T result = stream.filter(t -> {
double x = getX(t);
double y = getY(t);
return (x == tx && y == ty);
}).findFirst().orElse(null);
return result;
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;
_Optional.get
_ (NoSuchElementExceptionでユーザーの意図が失敗する可能性が高い)を置き換える代替方法は、JDK10で導入されたより詳細なAPI Optional.orElseThrow()
。 著者の言葉 -
Optional.get()
は「魅力的な迷惑行為」であり、プログラマーにとって魅力的であり、頻繁にエラーを引き起こします。 人々は、ゲッターが例外をスローすることを期待していません。同等のセマンティクスを持つOptional.get()
の代替APIを追加する必要があります。
Note:-これら両方のAPIの基礎となる実装は同じですが、後者はより明確に読み上げます明示的な代替としてコンシューマが使用する既存の Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)
実装にインライン化する値が存在しない場合、デフォルトでNoSuchElementExceptionがスローされます。