允许通过表达式来代替功能接口,
提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)
1、基本格式:
() -> {}
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
...
return resultStatement;
}
2、简单示例:
// 不需要参数,返回值1
() -> 1
// 一个参数(数字类型),返回其2倍的值(当参数个数只有一个时,可以省略小括号)
x -> 2 * x
// 2个参数(数字),返回差值(参数类型省略,一般情况下,编译器会从上下文环境中推断出参数类型)
(x, y) -> x – y
// 2个int型整数,返回和值(当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号)
(int x, int y) -> x + y
// 一个 string类型的参数,在控制台打印,无返回值(返回void)
(String s) -> System.out.print(s)
3、Button点击事件举例:
使用前:
btnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(LambdaActivity.this, "吼吼吼", Toast.LENGTH_SHORT).show();
}
});
使用后(alt+enter):
btnClick.setOnClickListener(v -> Toast.makeText(LambdaActivity.this, "吼吼吼", Toast.LENGTH_SHORT).show());
4、Thread实现Runnable举例:
使用前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world !");
}
}).start();
使用后:
new Thread(() -> System.out.println("Hello world !")).start();
或
new Thread(() -> {
System.out.println("Hello world !");
}).start();
5、双冒号表达式:方法引用,直接通过方法名称引用已有方法。
举例:
使用前:
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello world !");
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
使用后:
Observable.create((Observable.OnSubscribe<String>) subscriber -> subscriber.onNext("Hello world !"))
.subscribe(System.out::print);
6、方法引用分类:
静态方法引用:ClassName::methodName
实例上的实例方法引用:instanceReference::methodName
超类上的实例方法引用:super::methodName
类型上的实例方法引用:ClassName::methodName
构造方法引用:Class::new
数组构造方法引用:TypeName[]::new