Lambda表达式简单使用

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值