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?


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:



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.


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"));

Ich erhalte die Fehlermeldung "Die Methode orElseThrow (Lieferant <? erweitert X>) im Typ Optional <QueryEntities> gilt nicht für die Argumente (() -> {})"
BdEngineer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.