À propos du principe de :: dans System.out :: println

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.forEach(System.out::println);

Parmi eux, list.forEach peut être réécrit comme le code suivant : for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } ou égal à le code suivant :


for(String s : list) {
    
    
    System.out.println(s);
}

Regardons le code source de la méthode forEach :

default void forEach(Consumer<? super T> action) {
    
    
    Objects.requireNonNull(action);
    for (T t : this) {
    
    
         action.accept(t);
    }
}

En fait, il appelle essentiellement la boucle for. Son paramètre est un objet Consumer et la méthode accept de l'objet est appelée dans la boucle for. Notez que cette méthode est la méthode par défaut de l'interface, qui est une nouvelle syntaxe de JDK8 . Quant à savoir pourquoi il peut être écrit comme System.out :: println, cette syntaxe est appelée une référence de méthode. Cette fonctionnalité est également introduite après JDK8, et vous pouvez la considérer comme du sucre syntaxique pour les expressions lambda. Si nous ne l'écrivons pas ainsi, nous pouvons utiliser des expressions lambda pour réécrire le code suivant : list.forEach((t) -> System.out.println(t)); Si vous ne le comprenez pas, vous pouvez faites aussi ceci : list .forEach((String t) -> System.out.println(t)); Cet effet est le même que System.out::println.

おすすめ

転載: blog.csdn.net/qq_54042324/article/details/121644068