lambda表达式
lambda表达式有3个部分
- 代码块
- 参数
- 自由变量的值—————自由变量是指,即不是参数变量,也不是代码内部定义的变量。
基本语法:(String first, String second) -> first.length() - first.length()
这样的表达式就是一个简单的代码块,连同必须传递给代码的变量的说明。
对lambda表达式你只能做一将事:将其放入类型为函数式接口的变量中,这样它就被转换为该接口的实例。
例如,将它们传递给期望函数式接口的方法:
Arrays.sort(strings, (String x, String y) -> x.length() - y.length());
//该方法第二个参数为一个Comparator接口的实例
同时还有许多常用的函数式接口(具体列表自己查阅API)。
例如,编写消费lambda表达式的方法:
调用:repeat(10, (i) -> System.out.println("countdown: " + (9-i)));
声明:
//该IntConsumer函数式接口有个参数类型为int、返回值为void的方法
public static void repeat(int n, IntConsumer action)
{
for(int i = 0;i < n; i++) action.accept(i);
}
注意:
你不能将一个lambda表达式赋值给一个Object类型的变量,因为Object是类,不是函数式接口。
访问来自闭合作用域的变量
例如:
public static void repeatMessage(String text, int count){
Runnable r = ()->{
for(int i = 0; i< count; i++){
System.out.println(text);
}
};
new Thread(r).start();
}
public static void repeatMessage(String text, int count){
Runnable r = ()->{
while (count > 0){
count --;//错误:不能改变被捕获的变量
System.out.println(text);
}
};
new Thread(r).start();
}
调用:repeatMessage("hello", 10);
text和count就是lambda的两个自由变量。lambda表达式只能访问来自闭合作用域的final或有效的final的局部变量,并且lambda表达式不能改变任何捕获的变量。
方法引用和构造函数引用
方法引用
操作符 :: 将类或对象名称与方法名称分隔开。
有以下3种使用方式:
- 类 :: 实例方法
- 类 :: 静态方法
- 对象 :: 实例方法
第一种使用方式,第一个参数变成方法的接收者,并且其他参数也传递给该方法。
例如:
String :: compareToIgnoreCase 等价于 (x,y) -> x.compareToIgnoreCase(y)
第二种使用方式,所有的参数传递给静态方法。
例如:
Objects :: isNull 等价于 x -> Objects.isNull(x)
第三种使用方式,在给定的对象上调用方法,并且参数传递给实例方法。
例如:
System.out :: println 等价于 x-> System.out.println(x)
构造函数引用
与方法引用类似,不同的是构造函数引用中的方法名都是new。
例如:
int[] :: new //是一个含有一个参数的构造函数引用,该参数为数组长度
等价于 n->new int[n]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。