java8 interface fonctionnelle pour gérer le rappel
J'ai un générique méthode privée qui n'tâches courantes et est utilisé par d'autres méthodes. La méthode générique a if
et else
conditions à l'appui d'autres méthodes qui sont appelées. Exemple:
private void myGenericMethod(String name, int age){
common task1;
common task2;
if(name!= null && name.length > 0){
specific task 1;
specific task 2;
} else{
specific task 3;
specific task 4;
}
if(age > 18){
specific task 1`;
specific task 2`;
}
}
Je veux utiliser Java 8 lambda et j'ai créé une interface fonctionnelle appelée Invoker
avec un invoke
méthode.
public interface Invoker{
public void invoke()
}
Maintenant ma méthode générique ressemble à ceci et la méthode publique gère l'appeler la fonction de rappel de façon appropriée:
private void myGenericMethod(Invoker invoker){
common task1;
common task2;
invoker.invoke();
}
Est-il une interface fonctionnelle dans le JDK que je peux utiliser à la place de la création de cette interface par moi-même?
Vous pouvez regarder les
java.util.function
package et sélectionnez celui qui convient à vos besoins. Je ne pouvais pas dire parce que je ne sais pas si vos tâches spécifiques a un argument (ou plus) ect ...OriginalL'auteur zilcuanu | 2017-08-04
Vous devez vous connecter pour publier un commentaire.
Paquet
java.util.function
ne contient pas une interface fonctionnelle avec une méthode qui ne nécessite pas de paramètre et retournevoid
. Mais vous pouvez utiliserExécutable
interface à la place.Ensuite l'invocation aurait l'air assez simple:
Autres options
Il existe d'autres interfaces fonctionnelles susceptibles de vous intéresser, par exemple:
Fournisseur<T>
si vous voulez retourner une valeur deT
sans passer des paramètresFunction<T,R>
si vous souhaitez passer une valeur deT
et renvoie une valeur deR
à la Consommation<T>
si vous souhaitez passer la valeurT
en tant que paramètre et retournervoid
Pourquoi il n'y a pas d'alternative pour
Runnable
interface?À l'aide de
Runnable
interface pour un lambda qui ne renvoie rien et ne s'attend pas à des paramètres peut sembler controversé pour de nombreux programmeurs.Runnable
a été inventé pour l'exécution d'un code dans un thread séparé et de nombreux programmeurs identifier cette classe avec le multithreading. Même la documentation dit:Quelqu'un déjà demandé la même question il y a 2 ans, et si vous prenez un coup d'oeil à ce commentaire et Brian Goetz est réaction à elle vous permettra de comprendre que le langage Java, les concepteurs sont venus à la conclusion qu'il n'est pas nécessaire de créer une autre interface fonctionnelle qui imite la mise en œuvre de
Runnable
interface.Runnable
est destiné à encapsuler un travail qui peut être fait de manière asynchrone. En l'utilisant, dans ce contexte, est source de confusion[citation nécessaire]. Si l'intention est mal interprétée par d'autres développeurs, il peut conduire à de graves problèmes. Il a été suggéré de faire votre propre interface appeléeOperation
,Executable
ou quelque chose le long de ces lignes.Si vous allez avec l'Invocation de la terminologie, je suggère le nom de l'interface
Invokable
au lieu de cela, pour rester en accord avec les conventions de nommage.La raison pour laquelle je ne veux pas d'utilisateur
Runnable
est, il soulève la co développeurs sourcils quand ils voient Praticable et créer de la confusion. Je m'en tiendrai à Invokable. Mais à ma grande surprise, il n'y a pas une telle interface est Java8Ouais, il devrait être dans les
java.util.function
. À l'aide de votre personnalisé plutôt sera le mieux dans ce cas.Brian Goetz explique pourquoi il n'y a pas d'alternative à
Runnable
interface ici - stackoverflow.com/questions/27973294/... Citation: "je suis sûr que l'existence deRunnable
est pourquoi les concepteurs de Java ont estimé qu'ils n'avaient pas besoin d'ajouter une autre interface fonctionnelle", Brian a confirmé que.OriginalL'auteur Szymon Stepniak
Il y a aussi la possibilité d'utiliser
Consumer<Void>
. Il pourrait ressembler à ceciOriginalL'auteur Murat Karagöz