Bonjour. C'est Kecho. ** Utilisez-vous des références de méthodes? ** ** C'est pratique et lisible. Avec une telle méthode de référence. Je vais vous présenter quelques spécifications auxquelles je devrais faire attention.
public class Main {
public static void main(String[] args) throws Exception {
Arrays.asList("test1", "test2").stream().forEach(System.out::println);
}
}
// test1
// test2
Vous faites référence à une méthode statique. Vous pouvez également l'utiliser comme ça.
public class Main {
public static void main(String[] args) throws Exception {
Arrays.asList("test1", "test2").stream().map(String::toUpperCase).forEach(System.out::println);
}
}
// TEST1
// TEST2
Vous appelez toUpperCase de la classe String. Facile à voir et pratique.
De plus, bien que la méthode statique soit présentée ci-dessus, vous pouvez également utiliser la méthode d'instance.
class Customer {
public String getName() {
return "which1";
}
}
public class Main {
public static void main(String[] args) throws Exception {
Arrays.asList(new Customer(), new Customer()).stream().map(Customer::getName).forEach(System.out::println);
}
}
// which1
// which1
Vous pouvez écrire dans la même notation.
Ce qui suit peut être écrit avec le même
Customer :: getName```.
map(e -> Customer.getName(e)) //Lors de l'appel d'une méthode statique
map(e -> e.getName()) //Lors de l'appel de la méthode d'instance de l'instance stockée
Et si les deux méthodes peuvent être référencées? J'ai mentionné que vous pouvez appeler les méthodes statiques et d'instance dans la même notation, mais si vous avez les deux, laquelle sera utilisée?
class Customer {
public String getName() {
return "which1";
}
static public String getName(Customer customer) {
return "which2";
}
}
public class Main {
public static void main(String[] args) throws Exception {
Arrays.asList(new Customer(), new Customer()).stream().map(Customer::getName).forEach(System.out::println);
}
}
↓ ↓ ↓ ↓ ↓ La bonne réponse est 3 erreurs de compilation! J'obtiens une déclaration d'erreur comme celle-ci.
both getName() and getName(Customer) from the type Customer are eligible
Traduction japonaise:
```Référence de méthode ambiguë: getname () et getname (customer) de type customer sont éligibles```
Vous obtenez une erreur de compilation car vous ne savez pas lequel regarder.
# À quoi dois-je faire attention après tout?
Cette fois, j'ai lancé une erreur de compilation car les deux méthodes peuvent être référencées.
Cependant, certains modèles sont difficiles à comprendre en un coup d'œil et ne peuvent pas être référencés, comme indiqué ci-dessous.
1. Lorsque la méthode ne peut pas être référencée en raison de la visibilité
2. Lorsque le nom de la méthode est légèrement différent
3. Si les arguments de la méthode sont différents
etc
La méthode référencée peut provoquer un comportement inattendu de la part du développeur.
# Résumé
Lorsqu'il s'agit d'objets qui utilisent des types implémentés par le développeur, il est plus sûr de s'abstenir d'utiliser des références de méthode.
Recommended Posts