::
est appelée Méthode de Référence. Il s'agit d'une référence à une méthode unique. il s'agit d'une méthode existante par son nom.
Petite Explication:
Ci-dessous est un exemple d'une référence à une méthode statique:
Class Hey{
private static double square(double num){
return Math.pow(num , 2);
}
}
Function<Double, Double> square = Hey::square;
double ans = square.apply(23d);
square
peuvent être passés comme objet de référence et un déclencheur en cas de besoin. En fait, il peut parfaitement être utilisé comme une référence à une méthode normale d'un objet et pas seulement static
.
Class Hey{
private double square(double num){
return Math.pow(num , 2);
}
}
Hey hey = new Hey();
Function<Double, Double> square = hey::square;
double ans = square.apply(23d);
Function
ci-dessus est une interface fonctionnelle. Ainsi, pour expliquer pleinement ::
, il est important de comprendre Fonctionnelle de l'Interface. Simplement, en Fonction de l'interface est une interface avec une seule méthode abstraite.
Par exemple: Runnable
, Callable
, ActionListener
et si.
Function
ci-dessus est une interface fonctionnelle avec une seule méthode apply
. Elle prend un argument et produit un résultat. Donc, maintenant de retour à l' ::
, techniquement:
Méthode références sont des expressions qui ont le même traitement que les
les expressions lambda (c'est à dire, ils nécessitent un type de cible et encoder
interface fonctionnelle des cas), mais au lieu de fournir une méthode
corps, ils se réfèrent à une méthode existante par nom
En bref: Méthode de Référence se réfère à une méthode de l'interface fonctionnelle, à savoir sa appliqué la méthode (Comme mentionné précédemment, cette méthode est la seule offerte par les interfaces fonctionnelles). Tout comme Function
- dessus qui prend une entrée et de sortie, il existe de nombreuses autres interfaces fonctionnelles:
Consumer
prend en entrée et renvoie aucun résultat.
Consumer<Integer> b1 = System::exit; // void exit(int status)
Consumer<String[]> b2 = Arrays::sort; // void sort(Object[] a)
Consumer<String> b3 = MyProgram::main; // void main(String... args)
Parce qu' ::
fournit une référence à la méthode d'une interface fonctionnelle, le type de référence peut être n'importe quoi tant qu'il est valide interface fonctionnelle
class Hey{
private double getRandom(){
return Math.random();
}
}
Callable<Double> call = hey::getRandom;
Supplier<Double> call2 = hey::getRandom;
//Supplier is functional interface that takes no argument and gives a result
Ci-dessus getRandom
ne prend aucun argument et renvoie un double. hey::getRandom
est une abréviation pour l'expression lambda et son type de référence peut être n'importe quelle interface fonctionnelle qui répond aux critères:- ne prendre aucun argument et renvoie un résultat. Callable
et Supplier
parfaitement le match.
Un autre exemple:
Set<String> set = new HashSet<>();
set.addAll(Arrays.asList("leo","bale","hanks"));
Predicate<String> pred = set::contains;
boolean exists = pred.test("leo");
Prédicat est une interface fonctionnelle dont la méthode fonctionnelle, c'est de tester. Il prend en entrée et retourne un booléen. ::
fournit un cadre de référence (Predicate<String>
) qui peut être ensuite utilisé pour vérifier de "leo" satisfait le prédicat.
Bottom line: ::
fournit une référence à la méthode de la fonctionnelle de l'interface.
Plus sur ::
:
Méthode de Référence peuvent être obtenus dans des styles différents, mais ils signifient tous la même chose:
- Une méthode statique (
ClassName::methName
)
- Une méthode d'instance d'un objet particulier (
instanceRef::methName
)
- Une super méthode d'un objet particulier (
super::methName
)
- Une méthode d'instance de l'arbitraire d'un objet d'un type particulier (
ClassName::methName
)
- Un constructeur de la classe de référence (
ClassName::new
)
- Un tableau constructeur de référence (
TypeName[]::new
)
À titre de référence: http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html