JDK8中有双冒号的用法,就是把方法当做参数传到流内部,使流的每个元素都传入到该方法里面执行一下。
<强>代码其实很简单:强>
以前的代码一般是如此的:
公开课AcceptMethod { 公共静态孔隙printValur (String str) { system . out。println(打印值:+ str); } 公共静态void main (String [] args) { 列表al=arrays . aslist (“a”、“b”、“c”,“d”); (字符串:al) { AcceptMethod.printValur(一个); }//下面的每个循环和上面的循环是等价的 al.forEach (x→{ AcceptMethod.printValur (x); }); } }
现在JDK双冒号是:
公开课MyTest { 公共静态孔隙printValur (String str) { system . out。println(打印值:+ str); } 公共静态void main (String [] args) { 艾尔=数组列表。asList (“a”、“b”、“c”,“d”); al.forEach (AcceptMethod:: printValur);//下面的方法和上面等价的 消费者methodParam=AcceptMethod:: printValur;//方法参数 al.forEach (x→methodParam.accept (x));//方法执行接受 } }
上面的所有方法执行玩的结果都是如下:
打印值:一个
引用>
打印值:b
打印值:c
打印值:d
在JDK8中,接口Iterable 8中默认实现了forEach方法,调用了JDK8中增加的接口内消费者的接受方法,执行传入的方法参数。
JDK源码如下:
/* * *执行给定的操作的每个元素{@code Iterable} *,直到所有的元素都已经被处理或操作抛出 *例外。除非另有指定的实现类, *操作执行的顺序迭代的迭代(如果订单 *指定)。抛出的异常动作传递到 *调用者。 * * @implSpec * & lt; p>如果默认实现的行为: * & lt; pre> {@code * (T T:这个) * action.accept (t); *}& lt;/pre> * * @param行动为每个元素执行的动作 * @throws NullPointerException如果指定的行动是零 * @since 1.8 */默认空forEach (Consumer<& # 63;超级T>动作){ Objects.requireNonNull(行动); (T T:这){ action.accept (t); } }另外补充一下,JDK8改动的,在接口里面可以有默认实现,就是在接口前加上违约,实现这个接口的函数对于默认实现的方法可以不用再实现了。类似的还有静态方法。现在这种接口除了上面提到的,还有BiConsumer, BiFunction, BinaryOperation等,在java.util.function包下的接口,大多数都有,后缀为供应商的接口没有和别的少数接口。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
java8中:用法示例(JDK8双冒号用法)