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?

mdo
sumber
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:

507

Tentu.

.orElseThrow(() -> new MyException(someArgument))
Louis Wasserman
sumber
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.

Manu
sumber
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"));
Ashish Pushp
sumber
saya mendapatkan kesalahan "Metode orElseThrow (Pemasok <? extends X>) dalam jenis Opsional <QueryEntities> tidak berlaku untuk argumen (() -> {})"
BdEngineer