今天看到一行java代码:
nodes.forEach(this::buildTree);
this::buildTree是个什么鬼东西,还整个双冒号,java现在这么奔放了么???
foreach肯定不用说了,this肯定指的是当前nodes,机智的我按住了Ctrl点了下双冒号后面的东西,发现这是个迭代方法,结合需求初步猜测双冒号的功能是把前面集合的每一个对象一次去执行冒号后面的方法。
后面经过百度,发现::是java8 中新引入的运算符,是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下,跟俺猜的基本上差不多。
在JDK8中,接口Iterable 8中默认实现了forEach方法,调用了 JDK8中增加的接口Consumer内的accept方法,执行传入的方法参数。
JDK源码如下,从第二十行我们大致可以看到其实现原理:
/**
* Performs the given action for each element of the {@code Iterable}
* until all elements have been processed or the action throws an
* exception. Unless otherwise specified by the implementing class,
* actions are performed in the order of iteration (if an iteration order
* is specified). Exceptions thrown by the action are relayed to the
* caller.
*
* @implSpec
* <p>The default implementation behaves as if:
* <pre>{@code
* for (T t : this)
* action.accept(t);
* }</pre>
*
* @param action The action to be performed for each element
* @throws NullPointerException if the specified action is null
* @since 1.8
*/
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}