对于jdk1.8其实并不是那么熟悉,但是要学习这一点,对以后工作有好处,接下来开始学习jdk1.8在Android studio的配置以及lambda表达式的使用吧。
Lambda表达式
jdk1.8中新增的核心特性有lambda表达式,函数式接口,流API,默认方法,新的Date,以及Time API。详细介绍请看这里: Java 8简明教程 。
下面给大家介绍的是Lambda表达式,该表达式允许我们把行为传到函数里。之前把行为传到函数里我们采用的是匿名内部类,该方法导致行为最重要的方法夹杂在中间,不够突出,详见举例中代码。
lambda表达式取代了匿名内部类,取消了模板,允许程序猿用函数式风格编写代码,使代码可读性更高,尽管刚开始你会看不懂,但是你应该尝试,毕竟这是新的东西,我已从中获益。
格式
基本格式是:() -> {}
有下面三种具体表达:
- (params) -> expression
- (params) -> statement
- (params) -> {statement}
这个新的特性是激动人心的,那么有个问题,怎么用,是啊,很多东西我们都懂,但为什么还是过不好这一生,说远了,问题的关键是:用,得用,你还得会用。
lambda使用举例
as里的配置
要使用lambda,首先必须配置编译环境,这里使用的android studio,as默认的jdk版本是1.6,修改成1.8即可使用,这里确保你系统安装了jdk1.8,否则需要用到下面插件: gradle-retrolambda
as里的配置有两种方法:
配置gradle脚本
在build.gradle脚本中添加下列代码:
android {
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
}
当然写成下面的样子也是可以的
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
设置项目结构
按快捷键Ctrl+Shift+Alt+S进入项目结构设置,把app的jdk版本修改成1.8,注意你需要填写1.8,因为那个下拉菜单里没有这一选项,如下:
这里采用的是第二种方法,然后项目自动同步。
同步后是会在build.gradle脚本下生成和上面一样的东东:
举例
点击按钮触发事件
传统的点击事件,应用匿名内部类:
Button button = (Button) findViewById(R.id.btn_insert);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show();
}
});
通过上面设置jdk版本为1.8后,鼠标放到new View.OnClickListener()里会有下面提示:
然后我们按快捷键Alt+Enter,是这样的
继续回车后,见证奇迹的时刻到来lo。。。
使用lambda表达式之后是这样的
Button button = (Button) findViewById(R.id.btn_insert);
button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show());
一行代码就搞定了,清晰可见,把行为传到了函数里,这里注意v不可省略,是函数onClick的参数,当然就可以是任意名字,我还是建议就用一个字母表示,简单嘛,当然了首先你得知道她的意思,尽管她的很多行为你始终不会明白,哈哈。
实现Runnable接口
传统实现Runnable接口是这样的:
new Thread(new Runnable() {
@Override
public void run() {
Log.i("TAG", "haha");
}
}).start();
使用lambda表达式之后是这样的:
new Thread(() -> {
Log.i("TAG", "haha");
}).start();
哇哦,是不是有种很清爽的感觉,乍一看,这是什么鬼,仔细分析后是用了lambda表达式() -> {},哈哈,简单的爱,这是程序员懒惰的一种体现,可以写出更简洁高校的代码,赞一个。
比较
既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析。
第一个关键的不同点就是关键字 this。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向包围lambda表达式的类。
第二是编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。
总结
lambda表达式还有很多用法,比如迭代器,详细用法请参考这里: Java8 lambda表达式10个示例
好了,希望你们喜欢!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)