首先看看传统的增强for循环
for (String a : list) {
System.out.println(a);
}
再看看JDK8中的增强for循环
list.forEach(System.out::println)
首先明确一点,lambda表达式引用非抽象方法时,需要通过一个函数式接口,这个接口中的抽象方法
的参数和返回值类型必须和非抽象方法一致
这里通过lambda表达式函数式接口Consumer 的抽象方法accept引用了System.out类下的静态方法println
看一下forEach方法:
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } JDK8里定义的函数式接口Consumer : @FunctionalInterface public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } } 这样一来通过 lambda 表达式的方式遍历集合中的元素,list.forEach(System.out::println) 就很好理解了, Consumer<? super T> action=System.out::println 执行action.accept(t)相当于执行了System.out.println(t);