Java 8-Methodenreferenzen: Geben Sie einen Lieferanten an, der ein parametrisiertes Ergebnis liefern kann

259

Ich würde gerne verwenden

java.util.Optional.orElseThrow()

mit einem Ausnahmetyp, der nach einem Konstruktorparameter fragt. Etwas wie das:

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

Gibt es eine Möglichkeit, einen Lieferanten zu erstellen, der meinen Argumentwert übergibt?

mdo
quelle
43
Warum kannst du das nicht orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström
6
Professioneller Java-Programmierer mit vielen Streams und optionaler Erfahrung… Manchmal lande ich immer noch hier. Und deshalb bevorzuge ich Kotlin.
Drew Stephens

Antworten:

507

Sicher.

.orElseThrow(() -> new MyException(someArgument))
Louis Wasserman
quelle
22

Es scheint, dass Sie nur RuntimeException von der Methode auslösen können orElseThrow. Andernfalls erhalten Sie eine Fehlermeldung wie MyException cannot be converted to java.lang.RuntimeException

Update : - Dies war ein Problem mit einer älteren Version von JDK. Ich sehe dieses Problem bei den neuesten Versionen nicht.

Manu
quelle
1
danke, das hat mich umgehauen, wenn ich Optionalin groovy benutze . Der Versuch, throw Exceptionvon einem groovigen Verschluss zu kommen, aber es schlug fehl java.lang.reflect.UndeclaredThrowableExceptionund wechselte zu einem RuntimeExceptionfesten.
Ted Naleid
Gut zu wissen. Glücklicherweise verwende ich in meinem Fall RuntimeExceptions, aber dies ist möglicherweise nicht immer der Fall.
Hbobenicio
Falsch gemäß der Klassendokumentation, für Optional.orElseThrowdie angegeben ist, dass Sie ein werfen können, Throwablewas ein Erroroder ein beliebiges bedeutet Exception.
Basil Bourque
Ich denke, dies war ein Problem mit einer älteren Version von JDK 8.
Manu
@Manu Vielleicht beziehen Sie sich auf JDK-8047338, das in dieser Frage besprochen wurde: RuntimeException mit Optional.orElseThrow in Stream auslösen . Wenn ja, nehmen Sie es in Ihre Antwort auf. Ich habe nicht genug Kaffee getrunken, um zu erkennen, ob dies genau richtig ist oder nicht, daher werde ich Ihre Antwort nicht selbst bearbeiten.
Basil Bourque
10
optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));
Ashish Pushp
quelle
Ich erhalte die Fehlermeldung "Die Methode orElseThrow (Lieferant <? erweitert X>) im Typ Optional <QueryEntities> gilt nicht für die Argumente (() -> {})"
BdEngineer