您的位置:首页 > 编程语言 > Java开发

java lambda表达式

2018-03-11 11:09 561 查看
定义:传递一段可稍后执行的代码。如果你想立即执行该段代码就不应该使用lambda表达式。匿名函数。

延缓执行的原因:

- 运行代码在分离的线程中。

- 运行相同的代码多次。

- 在算法中对的时机执行(如排序的比较操作符)。

- 在某些事件发生后执行(例如点击了button)。

- 只有在必要的时候执行。

lambda表达式的使用:

在java中,lambda表达式只能用于function interfaces(功能接口)。

功能接口:一个有单一抽象方法的接口。

为什么功能接口必须有一个单一抽象接口?不是所有方法在接口中都是抽象的吗:事实上,对象类常常重新声明像toString(),clone()这些方法使他们不再是抽象的。而且在java SE8 中引入了default方法,接口可以被声明为非抽象的方法。

最好把lambda表达式想象成是一个函数而非对象。

比内部类高效。

Arraylist中有个removeIf()方法接收一个Predict参数,它是特定的设计传递一个lambda表达式,举个例子
list.removIf(e->e == null)
移除array list中所有的空值。

lambda表达式语法

//1.单行
public class LambdaTest {

public static void main(String[] args) {
String [] strings = new String[]{"ad","bssf","csdaa","dd"};
//根据长度进行排序:
Arrays.sort(strings,(String first,String second)
-> first.length() - second.length());
System.out.println(Arrays.toString(strings));
}
}
//2.多行
Arrays.sort(strings, (String first, String second) -> {
if (first.length() - second.length() > 0)
return 1;
else {
return -1;
}
});
//3.无参
public class LambdaTest2 {

public static void main(Stri
4000
ng[] args) {
Runnable runnable = () -> System.out.println("Hello");
runnable.run();
}

}
//4.参数如果可以被推断也可以省略圆括号
// public Timer(int delay, ActionListener listener)
Timer t = new Timer(1000,event -> {
System.out.println("The time is" + new Date());
});
t.start();

JOptionPane.showMessageDialog(null, "quit?");
System.exit(0);
//5.可以不指明返回类型,这常被以上下文推断出
//特别的:(int x) -> { if(x>=0) return 1;}是无效的。
(String first,String second) -> first.length() - second.length()
//返回的肯定是int类型


方法引用:

符号
::
分离对象名或类名中的方法。

使用原则:

object::instanceMethod
Class::staticMethod
前面两个是参数给方法使用即x -> System.out.println(x);这样子的
Class::instanceMethod
这个一般有两个参数,前一个参数是方法的目标。例如(x,y)->x.CompareToIgnoreCase(y);


this关键字:
this::equals 等价于 x ->this.equals(x);


super关键字:
super::instanceMethod
调用父类的实例方法。

构造引用:和方法引用类似,区别是方法名是new。

根据上下问调用对应的构造方法。

数组类型的构造引用了一个参数(数组长度)举个例子:
int[]::new 等价于 x ->new int[x]


变量范围(可用域):

通常,你在封闭的方法和类中存取变量是要考虑变量的范围。例如:

public static void repeatMessage(String text, int delay){
ActionListener listener = event ->
{
System.out.println(text);
ToolKit.getDefaultToolkit().beep();
};
new Timer(delay,listener).start();
}


这里text变量没有定义在lambda表达式中。

一个lambda表达式有三个要素:

一块代码。

参数。

提供给
free
变量的值。free变量指的是没有在lambda表达式中定义的无参变量。

上面的text就是free变量。

在lambda中的变量只能是effectively final的(初始化后从不赋予新值的).无论是在lambda表达式的内部还是外部。

lambda内部变量在命名时范围和嵌套块的一样,不能同名。

使用this关键字,引用的是创建该lambda方法的class的this。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: