Ho eseguito l'aggiornamento a Java 8 e ho provato a sostituire una semplice iterazione tramite una mappa con una nuova espressione lamdba. Il ciclo ricerca valori nulli e genera un'eccezione se ne viene trovato uno. Il vecchio codice Java 7 è simile al seguente:Perché non posso lanciare un'eccezione in un'espressione lambda Java 8?
for (Map.Entry<String, String> entry : myMap.entrySet()) {
if(entry.getValue() == null) {
throw new MyException("Key '" + entry.getKey() + "' not found!");
}
}
E il mio tentativo di convertire questo in Java 8 assomiglia a questo:
myMap.forEach((k,v) -> {
if(v == null) {
// OK
System.out.println("Key '" + k+ "' not found!");
// NOK! Unhandled exception type!
throw new MyException("Key '" + k + "' not found!");
}
});
Qualcuno può spiegare perché la dichiarazione throw
non è consentita qui e come questo potrebbe essere corretto? quick-fix suggerimento
di Eclipse non guardare a destra a me ... circonda semplicemente la dichiarazione throw
con un try-catch
blocco:
myMap.forEach((k,v) -> {
if(v == null) {
try {
throw new MyException("Key '" + k + "' not found!");
}
catch (Exception e) {
e.printStackTrace();
}
}
});
C'è una risposta molto semplice: le espressioni lambda sono un mezzo concisa di attuazione di un'interfaccia funzionale. Come qualsiasi altro modo per implementare un'interfaccia, devi conformarti al contratto dell'interfaccia, il che significa che puoi solo lanciare le eccezioni consentite dal tipo di target. Non c'è magia qui. –