在android上使用Lambda

现在android开发最多只支持到java7,这导致我们无法在android上使用java8中的lambda。不过我们可以借助第三方插件来帮助我们实现,这就是retrolambda

retrolambda

retrolambda可以让lambda表达式、方法引用、try-with-resourcesb语句在java 7,6,5上使用。它通过转化编译后的java8字节码以便在更低的java环境中运行。

retrolambda的使用也有一些限制:

  1. Retrolambda 并不支持java8新api(如Stream类),如果你想使用 java.util.stream下的api,你可以使用第三方库streamsupport

  2. retrolambda对接口中的默认方法静态方法的实现也是有限制,默认情况下是不支持这两个特性。如果你需要使用也可以的使用的,不过有风险。retrolambda对于存在默认方法和静态方法的接口,会在编译时会额外生成以接口名+ $为名的class文件,默认方法和静态方法全部以静态方法的形式生成在这class文件中,当我们去使用接口类中的默认方法时,实际上是使用接口名+ $类中的静态方法。我测试过程中,发现接口中的默认方法可以使用,但是接口中的静态方法无法使用抛出了java.lang.VerifyError的错误。因为retrolambda对这两个特性支持不是很好,因此建议最好不要使用

现在android开发基本上使用gradle来进行构建,插件gradle-retrolambda可以帮助你在android studio中使用Retrolambda

gradle-retrolambda

1.下载java8并安装。
2.在项目中要配置java8 jdk的路径
这里写图片描述
3.在工程根build.gradle中加入如下:

  buildscript {
    repositories {
     jcenter()
   }
   dependencies {
      classpath 'me.tatarka:gradle-retrolambda:3.2.4'
     }
  }

4.在项目build.gradle中加入如下:

  apply plugin: 'me.tatarka.retrolambda'

  android {
   //others

   compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

5.加入其他配置(可选)

指定将源码编译的级别,使用下列代码,会将代码编译到兼容1.7的字节码格式(不写默认1.6)

retrolambda {
 javaVersion JavaVersion.VERSION_1_7
}

因为现在gradle-retrolambda使用的retrolamdba是2.0.6,如果你想用其他的版本,你可以自行配置

dependencies {

   retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:+'
   // Or a local version
   // retrolambdaConfig files('libs/retrolambda.jar')
}

混淆可以加入

 -dontwarn java.lang.invoke.*

ok现在都配置好了我们就可以尽情的使用Lambda表达式了,赶紧对比下

使用前:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        System.out.println(v);
    }
});

使用后

button.setOnClickListener(System.out::println);

get it~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值