1. 依赖添加
工程的build.gradle里面添加
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
app模块的build.gradle里面添加
apply plugin:'me.tatarka.retrolambda'
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
2.简单使用
匿名内部类常规写法
Button id_btn = (Button) findViewById(R.id.id_btn);
id_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e("initListener","onClick");
}
});
lambda表达式写法
id_btn.setOnClickListener( v -> Log.e("initListener","onClick"));
3.语法介绍
基本的形式
(参数) -> {表达式}
其中符号->是不变的
参数的变化情况:
- 无参数
() -> 表达式 - 单一参数
param -> 表达式(能自动推导参数类型,可省略()括号) 非单一参数
(param1,param2) -> 表达式(能自动推导参数类型)
(int param1,int param2) -> 表达式(不能自动推导参数类型 需要在参数前面加参数类型)表达式的变化情况:
空表达式
param -> {}- 单行表达式
param -> 表达式(可忽略{}括号,返回表达式也可以省略return) - 非单行表达式
param -> {表达式1;表达式2;}(表达式可以是return语句)
自定义两个参数的点击事件
public interface onClickListener{
void onClick(View view,int position);
}
private onClickListener onClickListener;
public void setOnClickListener(onClickListener onClickListener) {
this.onClickListener = onClickListener;
}
lambda表达式写法
setOnClickListener((v,position) -> Log.e("自定义的Listener",position+""));
再比如说这个例子
List<Integer> list = new ArrayList<>();
//匿名内部类形式
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a-b;
}
});
//Lambda写法
Collections.sort(list, (a, b) -> a - b);
4. Functional Interface(函数式接口)
Comparator接口只有一个抽象方法需要实现,这样的接口在Java 8中称为函数式接口。在Java 8之后的源码中,这样的接口都会使用@FunctionalInterface这个注解去标注
函数式接口就是只能有一个抽象方法是不包括default标记的方法(有默认实现)和Object中已有的方法。
5. 返回值
Lambda表达式除了可以作为参数,也可以作为变量赋值
View.OnClickListener clickListener = v -> Log.e("initListener", "onClick");
id_btn.setOnClickListener(clickListener);
6. 变量作用域
a是常量 不能被修改 ambda表达式可以直接访问外部变量而不需要加final,但这个变量不能够修改
lambda表达式中的()中的参数名不能与外部变量同名
int a = 1;
id_btn.setOnClickListener(x -> Log.i("tag", String.valueOf(a)));
lambda表达式的this是代表对应的外部类,而不代表匿名内部类本身
匿名内部类的this就是代表该匿名内部类
id_btn.setOnClickListener( view -> Log.e("initData", this.toString()));
7.Method References(方法引用)
List<Integer> list = new ArrayList<>();
//Lambda基本表达式
Collections.sort(list, (a, b) -> a.compareTo(b));
//方法引用
Collections.sort(list, Integer::compareTo);
方法引用的基本形式就是:
类名::方法名
方法的()没什么意义,一般不写
- 对象::实例方法
- 类::静态方法
类型对象::实例方法
Integer::compareTo就属于类型对象::实例方法这种
8. Constructor References(构造方法引用)
表现形式
类名::new
创建一个接口
public interface onEmpty<T>{
T isNull();
}
//判断是不是为null
private <T extends String>boolean isEmpty(onEmpty<T> viewEmpty){
return viewEmpty != null && viewEmpty.isNull() == null;
}
//匿名内部类写法
isEmpty(new onEmpty<String>() {
@Override
public String isNull() {
return new String();
}
});
//lambda表达式原始写法
isEmpty(() -> new String());
//lambda构造方法写法
isEmpty(String::new);