Comment fonctionne la syntaxe de référence de méthode dans Java 8 [duplicate]
J'ai une certaine confusion sur le fonctionnement des références de méthode dans Java 8. J'ai écrit le segment de code suivant pour filtrer les fichiers cachés dans un dossier. Ils produisent un résultat correct. Je ne comprends pas -> comment la signature de méthode de la méthode listFiles fonctionne pour l'option 2 de ce segment de code.
C'est ce que j'ai trouvé dans la documentation Java 8
File[] listFiles()File[] listFiles(FileFilter filter)File[] listFiles(FilenameFilter filter)
File[] hidden = f.listFiles((p)-> p.isHidden()); //Option 1 - function signature matching (based on my understanding)
for (int i = 0; i < hidden.length; i++) {
System.out.println(hidden[i]);
}
System.out.println("================================");
File[] hidden1 = f.listFiles(File::isHidden); //Option 2 - how this method call is working
for (int i = 0; i < hidden1.length; i++) {
System.out.println(hidden1[i]);
}
Réponses
Qu'est-ce qu'une référence de méthode
Vous pouvez voir une référence de méthode comme une expression lambda, qui appelle une méthode existante.
Types de références de méthode
Il existe quatre types de références de méthode:
- Référence à une méthode statique:
ContainingClass::staticMethodName - Référence à une méthode d'instance d'un objet particulier:
containingObject::instanceMethodName - Référence à une méthode d'instance d'un objet arbitraire d'un type particulier:
ContainingType::methodName - Référence à un constructeur:
ClassName::new
Comment le comprendre?
L'expression suivante qui répertorie tous les fichiers cachés: f.listFiles(p -> p.isHidden());
Cette expression est composée par la méthode d'instance listFiles(FileFilter)et votre expression lambda p -> p.isHidden()qui n'est pas une méthode anonyme mais une méthode d'instance existante de la classe File.
Notez qu'il FileFilters'agit d'une interface fonctionnelle et peut donc être utilisée comme cible d'affectation pour une expression lambda ou une référence de méthode. Par conséquent, vous pouvez écrire votre expressionf.listFiles(File::isHidden);
Notes annexes
- Vous n'avez pas besoin des parenthèses entourant le
p. Pour une meilleure lisibilité, je suggère de remplacer(p)par simplement un fichierp. Par conséquent, votre expression lambda deviendrap-> p.isHidden(). - Votre boucle for peut être remplacée par une boucle for améliorée :
for (File value : hidden) {
System.out.println(value);
}
Documentation:
Référence de la méthode
FileFilter