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.