JAVA中关于lambda表达式的一些问题

@Test
public void iterTest() {
List languages = Arrays.asList("java","scala","python");
//before java8
for(String each:languages) {
System.out.println(each);
}
//after java8
languages.forEach(x -> System.out.println(x));
languages.forEach(System.out::println);
}
请问,这里的System.out.println为什么可以使用lambda表达式,lambda表达式不是必须用在函数式接口上吗?另外,数组构造器怎么构造泛型数组。

这里很好的解释了

System.out::println
相当于是forEach(Consumer<? super E> action) 里Consumer函数接口的实现,消费函数接口,接受一个实参,无返回值。

函数式接口,并不是单单指加了注解@FunctionalInterface的接口。
只要某个interface的定义中,只有一个可被实现的方法,那么这个接口定义的变量就可以作为lambda表达式的接收方。