Referensi metode Java 8: menyediakan Pemasok yang mampu memasok hasil yang diparameterisasi


259

Saya ingin menggunakannya

java.util.Optional.orElseThrow()

dengan tipe pengecualian yang meminta parameter konstruktor. Sesuatu seperti ini:

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

Apakah ada cara untuk membuat Pemasok yang memasukkan nilai argumen saya?


43
Kenapa kamu tidak bisa orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström

6
Programmer Java profesional dengan banyak aliran & pengalaman opsional ... Saya kadang-kadang masih sampai di sini. Dan inilah mengapa saya lebih suka Kotlin.
Drew Stephens

Jawaban:



22

Tampaknya Anda hanya dapat melempar RuntimeException dari metode orElseThrow. Kalau tidak, Anda akan mendapatkan pesan kesalahan seperti MyException cannot be converted to java.lang.RuntimeException

Pembaruan : - Ini adalah masalah dengan versi JDK yang lebih lama. Saya tidak melihat masalah ini dengan versi terbaru.


1
terima kasih, ini membuat saya kesal ketika menggunakan Optionaldi groovy. Mencoba throw Exceptiondari penutupan asyik, tetapi gagal dengan java.lang.reflect.UndeclaredThrowableException, mengubahnya menjadi RuntimeExceptiontetap itu.
Ted Naleid

Senang mengetahui tentang itu. Untungnya dalam kasus saya, saya menggunakan RuntimeExceptions, tetapi ini mungkin tidak selalu demikian.
hbobenicio

Salah sesuai dengan dokumentasi kelas Optional.orElseThrowyang mengatakan Anda bisa melempar Throwableyang berarti Erroratau apa saja Exception.
Basil Bourque

Saya pikir ini adalah masalah dengan versi yang lebih lama dari JDK 8.
Manu

@ Manu Mungkin Anda merujuk pada JDK-8047338 yang dibahas pada Pertanyaan ini, Lempar RuntimeException ke dalam Stream dengan Optional.orElseThrow . Jika demikian, masukkan dalam Jawaban Anda. Saya tidak punya cukup kopi untuk membedakan apakah ini tepat atau tidak, jadi saya akan menahan diri untuk tidak mengedit Jawaban Anda sendiri.
Basil Bourque

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

saya mendapatkan kesalahan "Metode orElseThrow (Pemasok <? extends X>) dalam jenis Opsional <QueryEntities> tidak berlaku untuk argumen (() -> {})"
BdEngineer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.