这里是java8 的新特性的应用。
forEach是属于java集合的一个方法,准确来说,集合在java8中拥有一个stream方法,可以得到一个流对象,这个对象拥有很多方法,这些方法可以很方便的对集合进行例如排序,分组,计数,遍历,转换等操作,而遍历是比较常见的一种,forEach就是用来做这个的,这里的forEach就是stream的forEach。
java此时还有另外一个特性叫做lambda表达式和函数式接口,仅仅有一个未实现方法的接口,可以直接写作(参数列表) -> {方法体}这种形式。
例如:
@FunctionalInterface
public interface FuncA {
void doSomeThing(String str);
}
那么上面这种接口就可以直接写作:
FuncA funcA = (str) -> {
System.out.println("hello");
};
类似的还有Swing或者javaFx的监听器:
btn.addActionListener(e->{
// do something
});
这样就省去了之前需要专为他编写一个实现类或者匿名内部类的代码,直接对接口进行实现。
而在这之上,如果一个方法的调用中,这个方法给接口提供的参数和他接收的返回,和你现有某个实现完全一致,就可以进一步进行简化,称为方法引用。
forEach方法提供一个某种类型的Object(具体是什么类型是要看Stream类的泛型参数的,不过一般就是这个集合提供的那种类型),而System.out.println可以接受一个Object,因此,forEach提供的参数和System.out.println的参数类型是一致的,可以进行这种简写。
具体来说就是:原本应该写为:
.forEach(element -> {
System.out.println(element)
})
但是System.out.println的参数和传递的参数element 的类型完全匹配,所以这样的时候就可以简化为:
.forEach(System.out::println)
即forEach将会使用System.out对象的println方法进行接下来的操作。