Je sais comment créer une référence à une méthode qui a un paramètre String
et retourne un int
, c’est :
Function<String, Integer>
Cependant, cela ne fonctionne pas si la fonction lève une exception, disons qu'elle est définie comme suit :
Integer myMethod(String s) throws IOException
Comment dois-je définir cette référence ?
Vous devrez faire l'une des choses suivantes.
Si c'est votre code, définissez votre propre interface fonctionnelle qui déclare l'exception vérifiée :
@FunctionalInterface
public interface CheckedFunction<T, R> {
R apply(T t) throws IOException ;
}
et l'utiliser :
void foo (CheckedFunction f) { ... }
Sinon, enveloppez Integer myMethod(String s)
dans une méthode qui ne déclare pas d'exception vérifiée :
public Integer myWrappedMethod(String s) {
try {
retourne maMéthode(s) ;
}
catch(IOException e) {
throw new UncheckedIOException(e) ;
}
}
et ensuite :
Function<String, Integer> f = (String t) -> myWrappedMethod(t) ;
ou :
Fonction<String, Integer> f =
(String t) -> {
essayez {
retourne maMéthode(t) ;
}
catch(IOException e) {
throw new UncheckedIOException(e) ;
}
} ;
*Avertissement : je n’ai pas encore utilisé Java 8, j’ai seulement lu des articles à son sujet.
Une Fonction<String, Integer>
ne lève pas de IOException
, donc vous ne pouvez pas y mettre de code qui lève une IOException
. Si vous appelez une méthode qui s'attend à ce qu'une " Fonction<String, Integer>", alors la lambda que vous passez à cette méthode ne peut pas lever une
IOException`, point final. Vous pouvez soit écrire un lambda comme ceci (je pense que c'est la syntaxe lambda, je ne suis pas sûr) :
(String s) -> {
try {
return myMethod(s);
} catch (IOException ex) {
throw new RuntimeException(ex);
// (Or do something else with it...)
}
}
Ou, si la méthode à laquelle vous passez le lambda est une méthode que vous avez écrite vous-même, vous pouvez définir une nouvelle interface fonctionnelle et l'utiliser comme type de paramètre à la place de `Fonction<String, Integer>`` :
public interface FunctionThatThrowsIOException<I, O> {
O apply(I input) throws IOException;
}