Java 8 lambda Nul argument
Disons que j'ai fonctionnelles suivantes de l'interface en Java 8:
interface Action<T, U> {
U execute(T t);
}
Et pour certains cas, j'ai besoin d'une action sans arguments ou le type de retour. Alors j'écris
quelque chose comme ceci:
Action<Void, Void> a = () -> { System.out.println("Do nothing!"); };
Cependant, il me donne une erreur de compilation, j'ai besoin d'écrire comme
Action<Void, Void> a = (Void v) -> { System.out.println("Do nothing!"); return null;};
Ce qui est laid. Est-il possible de se débarrasser de la Void
type de paramètre?
- Jetez un oeil à stackoverflow.com/questions/14319787/...
- Si vous avez besoin d'une action, comme vous l'avez défini, il n'est pas possible. Cependant, votre premier exemple pourrait tenir dans une
Runnable
, qui que vous êtes à la recherche pourRunnable r = () -> System.out.println("Do nothing!");
- Je ne veux pas utiliser un Consommateur comme suggéré dans ce post.
- le problème est que l'Exécutable ne peut pas être un sous-type de mon type de fonction.
- En java, si dans la signature de la méthode que vous avez le type de retour - vous devez retourner quelque chose dans la méthode de la mise en œuvre.
- Matt réponse du fait que les types de travail, mais ce qui ne l'appelant lorsqu'il obtient une valeur de retour null?
- Vous pourriez croiser les doigts et espérons que les suggestions 2 & 3 dans ce post acceptée pour Java 9!
Vous devez vous connecter pour publier un commentaire.
La syntaxe que vous êtes après est possible avec une petite aide de la fonction qui convertit un
Runnable
enAction<Void, Void>
(vous pouvez le placer dansAction
par exemple):@FunctionalInterface
. Il a simplement dit qu'il n'est pas possible de le prolonger...Runnable
action doit prendre une coutume@FunctionalInterface
quelque chose qui s'appelleSideEffect
, 2. la nécessité de cette fonction d'assistance met en évidence que quelque chose de bizarre qui se passe, et probablement l'abstraction est cassé.Utilisation
Fournisseur
si il ne prend rien, mais renvoie quelque chose.Utilisation
Consommation
si elle prend quelque chose, mais ne retourne rien.Utilisation
Callable
si elle renvoie un résultat et pourrait jeter (plus semblable àThunk
en général CS termes).Utilisation
Exécutable
si il ne fait rien et ne peut pas jeter.public static void wrapCall(Runnable r) { r.run(); }
. MerciLe lambda:
représente en fait une implémentation d'une interface comme:
qui est complètement différent de celui que vous avez défini. C'est pourquoi vous obtenez une erreur.
Puisque vous ne pouvez pas prolonger votre
@FunctionalInterface
, ni présenter une nouvelle marque, alors je pense que vous n'avez pas beaucoup d'options. Vous pouvez utiliser leOptional<T>
interfaces pour désigner certaines des valeurs (type de retour ou de la méthode en paramètre est manquant, cependant. Cependant, ce ne sera pas à la lambda corps plus simple.Something
fonction ne peut pas être un sous-type de monAction
type, et je ne peux pas avoir deux types différents.Vous pouvez créer une sous-interface pour ce cas particulier:
Il utilise un méthode par défaut pour remplacer les hérité paramétrée méthode
Void execute(Void)
, de déléguer l'appel à la méthode la plus simplevoid execute()
.Le résultat est qu'il est beaucoup plus simple à utiliser:
Qui n'est pas possible. Une fonction qui a un non-vide de type de retour (même si c'est
Void
) doit retourner une valeur. Cependant, vous pourriez ajouter des méthodes statiques pourAction
qui vous permet de "créer" unAction
:Qui vous permettra d'écrire ce qui suit:
Ajouter une méthode statique à l'intérieur de votre interface fonctionnelle
Sortie
Je ne pense pas que c'est possible, car les définitions de fonctions ne correspondent pas à votre exemple.
Votre lambda expression est évaluée exactement comme
alors que votre déclaration ressemble à
comme un exemple, si vous avez d'interface suivants
le seul type de fonction (alors que l'instanciation) qui seront compatibles ressemble
et un manque d'instruction de retour ou d'argument, vous donnera une erreur du compilateur.
Par conséquent, si vous déclarez une fonction qui prend un argument et retourne un, je pense qu'il est impossible de le convertir à une fonction qui ne fait rien de mentionné ci-dessus.
Juste pour la référence fonctionnelle de l'interface peut être utilisée pour la méthode de référence en cas de jets de méthode et/ou renvoie une valeur.