Java 8メソッドリファレンス:パラメーター化された結果を提供できるサプライヤーを提供する


259

使いたい

java.util.Optional.orElseThrow()

コンストラクターパラメーターを要求するException型を使用します。このようなもの:

.orElseThrow(MyException::new(someArgument)) // obviously NOT working

引数の値を渡すサプライヤーを作成する方法はありますか?


43
なんでできないのorElseThrow(() -> new MyException(someArgument))
ChristofferHammarström14年

6
豊富なストリームとオプションの経験を持つプロのJavaプログラマー…私はまだ時々ここに行き着きます。そして、これが私がコトリンを好む理由です。
ドリュースティーブンス

回答:



22

メソッドからRuntimeExceptionのみをスローできるようですorElseThrow。そうしないと、次のようなエラーメッセージが表示されます。 MyException cannot be converted to java.lang.RuntimeException

更新:-これは古いバージョンのJDKの問題でした。最新バージョンではこの問題は発生しません。


1
おかげで、これはOptionalgroovyで使用するときに私を思いとどまらせました。throw Exceptionグルーヴィーなクロージャーからしようとしましたが、で失敗しjava.lang.reflect.UndeclaredThrowableExceptionRuntimeException修正されました。
Ted Naleid、2015

それについて知っておくと良い。幸い、私の場合、RuntimeExceptionsを使用していますが、常にそうであるとは限りません。
hbobenicio 2017

誤ったためにクラスのドキュメントによるとOptional.orElseThrow、あなたが投げることができると言うこれThrowableを意味しているErrorか、いずれかをException
バジルブルク2018

これはJDK 8の古いバージョンの問題だと思います
Manu

@Manuはおそらく、あなたが参照しているJDK-8047338、この質問に議論Optional.orElseThrowでストリーム内のRuntimeExceptionを投げます。その場合は、回答に含めてください。これがスポットオンかどうかを見分けるのに十分なコーヒーがなかったので、自分でアンサーを編集することは控えます。
バジルブルク

10
optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));

「Optional <QueryEntities>型のメソッドorElseThrow(Supplier <?extends X>)は引数(()-> {})には適用できません」
BdEngineer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.