Avatar ·

Que signifie l'opérateur "::" (double deux-points) en Java 8 ?

Bonjour à tous ! J'apprends Java 8 et je suis tombé sur une syntaxe étrange avec le double deux-points "::". Je l'ai vu dans des exemples avec des expressions lambda, mais je ne comprends pas exactement ce qu'il fait et quand l'utiliser. Par exemple, je sais comment écrire un lambda pour filtrer une liste de chaînes par longueur :
List<String> list = Arrays.asList("a", "bb", "ccc");
list.stream().filter(s -> s.length() > 1).forEach(s -> System.out.println(s));
Mais ensuite j'ai vu ce code :
list.stream().filter(s -> s.length() > 1).forEach(System.out::println);
Ici, au lieu de `s -> System.out.println(s)`, on écrit `System.out::println`. Quelle est cette magie ? Est-ce la même chose ? Pourquoi ne pas simplement utiliser un lambda ? Et comment savoir quand on peut écrire `::` et quand on ne peut pas ? Pouvez-vous expliquer en termes simples avec des exemples ? J'ai aussi vu ces variantes :
list.stream().map(String::toUpperCase)
list.stream().sorted(String::compareToIgnoreCase)
Comment cela