O que significa o operador "::" (dois pontos duplos) no Java 8?
Olá a todos! Estou estudando Java 8 e me deparei com uma sintaxe estranha com dois pontos duplos "::". Vi isso em exemplos com lambda expressions, mas não entendo o que exatamente faz e quando aplicá-lo.
Por exemplo, eu sei como escrever um lambda para filtrar uma lista de strings por comprimento:
List<String> list = Arrays.asList("a", "bb", "ccc");
list.stream().filter(s -> s.length() > 1).forEach(s -> System.out.println(s));
Mas depois vi este código:
list.stream().filter(s -> s.length() > 1).forEach(System.out::println);
Aqui, em vez de `s -> System.out.println(s)`, está escrito `System.out::println`. Que mágica é essa? É a mesma coisa? Por que não posso simplesmente usar o lambda? E como saber quando posso escrever `::` e quando não posso?