lambda表达式使用

1.必须保证java运行环境是jdk1.8以上
2.在工程的build.gradle中添加依赖,这会使用retrolambda来编译Java代码
buildscript {
    //开始加入
     dependencies {
     classpath 'me.tatarka:gradle-retrolambda:3.2.5'
     }
     //结束插入
}
3. 在app的build.gradle中应用插件声明:apply plugin:’me.tatarka.retrolambda’,在dependencies下加入以下引用
retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.3.0'
4. 加入compileOptions,这会让IDE使用用JAVA8语法解析,放在buildTypes里面
compileOptions {
 sourceCompatibility JavaVersion.VERSION_1_8
 targetCompatibility JavaVersion.VERSION_1_8
}
5.指定将源码编译的级别,,使用下列代码,会将代码编译到兼容1.6的字节码格式 放在app的build.gradle的放在buildTypes里面
retrolambda {
 javaVersion JavaVersion.VERSION_1_6
}
6.使用
TextView点击事件
mText.setOnClickListener(v1-> Toast.makeText(MainActivity.this,"测试lambda表达式",Toast.LENGTH_LONG).show());
7.语法

lambda表达式的语法由参数列表、箭头符号->和函数体组成。函数体既可以是一个表达式,也可以是一个语句块:
表达式:表达式会被执行然后返回执行结果。
语句块:语句块中的语句会被依次执行,就像方法中的语句一样

使用Lambda语法,这个接口必须符合规范,它必须是“函数式接口”。什么是函数式接口?
一个函数式接口是一个能够使用类函数做为参数的类型,一个lambda表达式支持提供这样一个实参。
关键的是记住一条,Lambda表达式只适用于只有一个抽象方法的“函数式接口”。
看下面例子:
接口:

public interface Interface1 {

    void show(String s,String s1);
}

public interface Interface2 {

    void show(String s);
}

public interface Interface3 {
    void show();
}

1. 完整表达式  

Interface1 interface1 = (String s,String s1) ->{
            Log.e("show1","你好吗");
            Log.e("show1","我很好,谢谢");
        };
 当然这样写也可以
Interface1 interface1 = (s,s1) ->{
            Log.e("show1","你好吗");
            Log.e("show1","我很好,谢谢");
        };
2. 只有一个参数 可以省略小括号

Interface2 interface2 = s ->{
            Log.e("show2","你好吗");
            Log.e("show2","我很好,谢谢");
        };
3.空参数时括号不能省

Interface3 interface3 = ()-> Log.e("show3","你好吗"); 

词法作用域(lambda表达式基于词法作用域,也就是说lambda表达式函数体里面的变量和它外部环境的变量具有相同的语义)
//this代表的是外部的Activity对象
Runnable r1 = () -> Log.e(TAG, this+"");//com.choice.zlc.myapplication.MainActivity@c0ff504
r1.run();
//toString()是外部类Activity的toString,而不是Runnable的
Runnable r2 = () -> Log.e(TAG, toString());//com.choice.zlc.myapplication.MainActivity@c0ff504
r2.run();
8.目标类型和匹配
//可以用一个Lambda表达式为一个函数接口赋值
Runnable r1 = () -> {System.out.println("Hello Lambda!");};
//然后再赋值给一个Object
Object obj1 = r1;

//不能这样干  ERROR! Object is not a functional interface!
Object obj2 = () -> {System.out.println("Hello Lambda!");};

//必须显式的转型成一个函数接口才可以
Object obj3 = (Runnable) () -> { System.out.println("Hello Lambda!"); };

//Lambda表达式只有在转型成一个函数接口后才能被当做Object使用,所以下面这句也不能编译
System.out.println( () -> {} ); //错误! 目标类型不明确,println方法可以接受任何类型的参数,而() -> {}能匹配上很多函数接口

//必须先转型
System.out.println( (Runnable)() -> {} ); // 正确
9联系方式

qq : 1509815887
email : zlc921022@163.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值