Lambda表达式简单使用

来源:互联网 发布:sql数据库编辑器 编辑:程序博客网 时间:2024/05/30 23:49

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();}//判断是不是为nullprivate <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);