Ⅰ java 8 新特性中p->p.setLastName("Doe"));
这是lambda表达式,也就是匿名函数,对于
persons.forEach(p->p.setLastName("Doe"));
这句代码,persons是一个list,forEach是一个内部迭代的方法,p->p.setLastName("Doe")是一个匿名函数对象。
这个语句等价于
for (Person p : persons) {
p.setLastName("Doe");
}
但是用for循环是外部迭代,速度略慢。
p->p.setLastName("Doe")
p是指list当中取出的对象,p可以自己定义,你写a也可以,相应的就要变成
a->a.setLastName("Doe")
->是lambda表达式的符号,->左边的对象去传入lambda函数体p.setLastName("Doe"),是前面传入的p去调用setLastName方法,如果要调用多个方法,那么方法体要用花括号包含
例如persons.forEach(p->{
p.setLastName("Doe")
System.out.println(p);
});
综上所述
persons.forEach(p->p.setLastName("Doe"));
是把p->p.setLastName("Doe");这个函数对象,给了persons的迭代器,让迭代器用这个函数去对集合中的每一个对象使用
有了lambda,你可以这样定义一个新的线程
new Thread(() -> {System.out.println("hello word!");}).start();
() -> {System.out.println("hello word!");}这句语句其实就是runnable接口的实现对象,
编译器会根据函数需要实现的接口去隐式转换,Thread的构造方法需要传递Runnable接口的实现类,所以new Thread(() -> {System.out.println("hello word!");}).start();相当于
new Thread((Runnable)() -> {System.out.println("hello word!");}).start();
其中()是匹配接口中的无参函数,因为Runnable接口中run方法为无参所以是()
->指明前面是传入参数,后面是函数体
有了lambda就能写出更加漂亮的代码,以及更少的工作量,实现一个方法的接口用匿名内部类的话看起来是冗余代码了
纯手打望采纳
Ⅱ (function($){...})(jQuery)是什么意思
(function($){...})(jQuery),这意味着定义并执行一个使用参数jQuery并通过形式参数$接收匿名函数的匿名函数。
分析:
1,匿名函数定义:javasript函数(arg){...},这种形式在javascript中称为匿名函数。 Arg是匿名函数的参数。
2,匿名函数调用:调用函数时,括号和参数写在函数之后。由于运算符的优先级,函数本身需要使用括号,即:(function(arg){...})(Param)这等效于使用参数arg定义匿名函数并使用param调用此匿名函数作为参数。
3,(function($){...})(jQuery)是使用实际参数jQuery定义和执行匿名函数,原因是在正式参数中使用$,以免与其他库冲突,因此实际参数使用jQuery。
4,等效形式:var fn = function($){....}; fn(jQuery);实际上,这是可以理解的,但是应该注意,fn不存在,直接定义函数,然后运行。只需“压缩”为以下(function($){...})(jQuery)。
(2)java匿名函数参数扩展阅读:
匿名函数的声明和使用:
首先,声明一个直接分配给事件的匿名函数;
Window.onload = function(){};
使用匿名函数表达式。将匿名函数分配给变量。
声明:var func = function(){};
呼叫:func();
自我执行功能:
可以从各种运算符开始但是普遍使用! ,如:!函数(参数列表){}(参数列表)。
使用()包装函数和函数后的括号,例如:(function(){}());
使用()值包装函数值,例如:(function(){})();