箭头函数和lambda表达式
Java中lambda表达式
Lambda表达式是JAVA8中提供的一种新的特性,是一个匿名函数方法。可以把Lambda表达式理解为一段可以传递的代码,可以写出更简洁、更灵活的代码。
这里先给简要的定义:将匿名函数赋值给变量的简写方式的函数称为lambda 表达式。
例:lambda表达式创建线程
public static void main(String[] args) {
Thread t1=new Thread(() -> System.out.println("匿名内部类方式-启动线程"));
t1.start();
}
lambda语法的标准格式:(参数列表)->{方法体}
即在参数和函数之间加上一个箭头符号 “->”
目的是:将一个函数赋值给一个变量;
- public可以不用写
- 函数名字是多余的,因为已经赋值给了变量
- 返回类型可省略,编译器自己可以判断返回类型(平时加上返回类型是防止自己写错的)
- 参数类型可省略,编译器自己可以判断参数类型
lambda表达式的常见使用场景
根据之前的思路;只要找到Java中函数式接口的皆可以放出lambda表达式的大招。
JDK 8之前已有的函数式接口
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
JavaScript中的箭头函数
箭头函数允许我们用更短的语法定义函数。箭头函数可用于替代传统函数function() {}
var fun1 = function(int x,int y){
return (x+y);
}
简写如下:
var fun1 = (x,y)=>x+y;
this相关问题
例子:
var id = 'GLOBAL';
var obj = {
id: 'OBJ',
a: function(){ console.log(this.id); },
b: () => { console.log(this.id); }
};
obj.a(); // 'OBJ'
obj.b(); // 'GLOBAL'
上面这个例子,对象obj的方法a使用普通函数定义的,普通函数作为对象的方法调用时,this指向它所属的对象。所以,this.id就是obj.id,所以输出’OBJ’。
但是方法b是使用箭头函数定义的,箭头函数中的this实际是继承的它定义时所处的全局执行环境中的this,所以指向Window对象,所以输出’GLOBAL’。(这里要注意,定义对象的大括号{}是无法形成一个单独的执行环境的,它依旧是处于全局执行环境中!!)
对于JavaScript程序中的this,如果this不属于任何function,那么这个this就指代JS全局对象;如果是浏览器端运行的JS程序,那么这个this就指代window全局对象。
如果这个this属于某个function,那么this指代的就是调用该function的对象。
若这种情况下function只是一个普通的函数,而不是某个类的方法,那么this的指代存在两种可能:
- 在ECMAScript 3标准,以及ECMAScript 5标准的非严格模式下,this指代全局对象。
- 在ECMAScript 5标准的严格模式下,this指代undefined。