本人在进行某些已知项目的阅读过程中发现了一个符号“->”感觉很高大上,于是就很好奇的进行各种资料的查阅,发现其是一种使用Java8特性的插件功能。
一、Lambda的简介
Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包。
运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。
lambda的表达式主要分为以下几种情况:
// 1. 不需要参数
() -> { do something}
// 2. 接收一个参数
(x) -> {do something}
// 3. 接受2个参数
(x, y) ->{do something}
涉及到具体的内容如下(参数可以随意变更)
普通按钮的点击事件
btn_animator.setOnClickListener(view -> { do something });
item的点击事件
lv_mylist.setOnItemClickListener((adapterView, view, i, l) -> { });
Runnable等涉及到匿名内部类的方法都可以用lambda来替代
具体的替代方法:可以按照原始的方式写出来之后,系统会提示“...can be replace with lambda”"alt+enter"即可替换
二、配置lambda到as中
1、项目的build.gradle(project)中添加lambda的class的依赖
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath 'me.tatarka:gradle-retrolambda:3.2.5' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
2、在build.gradle(module)中的android模块下添加以下代码,实现对java8的强制支持
compileOptions{ sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
完成此项添加后可以查看
3、在build.gradle(module)中进行文件的配置
apply plugin: 'me.tatarka.retrolambda'
完成以上的步骤即完成了对对lambda的配置工作,就可以在代码中需要的位置进行lambda的转换了
ambda表达式有优点也有缺点,优点在于大大简化代码行数,使代码在一定程度上变的简洁干净,但是同样的,这可能也会是一个缺点,由于省略了太多东西,代码可读性有可能在一定程度上会降低,这个完全取决于你使用lambda表达式的位置所设计的API是否被你的代码的其他阅读者所熟悉。另外的优点,也是lambda表达式比较显眼的优点就是对外部定义的局部变量的使用更加灵活,想象一种极端情况,你的代码中有地方需要接口回调套接口回调,有可能套了好几层,虽然这种情况出现的概率比较低,但是一旦出现这种代码,lambda表达式的这个优点就到了大显身手的时机。虽然我说了,lambda表达式能用的地方非常有限,但是不得不否认,接口中只有一个抽象方法这种情况在接口回调中发生的概率绝对比接口中有多个抽象方法的概率高的多,所以,虽然使用情况很单一,但是能用到的次数却足够的多,如果你决定用lambda表达式替换你项目中接口回调的传统写法,你会发现,这样的情况非常多。
使用需要注意的地方:
1是使用lambda时不要有自动装箱拆箱,影响性能,
2是建议使用parallelStream方式。这种方式数据小的时候性能可能会稍微差一点,数据量大时会比foreach,iterator更快。如果这影响到系统的核心功能或成为系统一个新的瓶颈,那就相当可怕了。