4722
- 收藏
- 点赞
- 分享
- 举报
jdk1.8新特性之lambda表达式及在安卓开发中的使用
本帖最后由 jp1017 于 2015-9-14 16:33 编辑
原帖见我的简书:[url=http://www.jianshu.com/p/5fc2b3362702]你好,我是简书[/url]
一、Lambda表达式
Lambda,是不是听着很熟悉,没错,在高等数学中这货经常和我们打交道,哈哈,这是一个希腊字母了,排名第十一,大写是Λ,小写是λ,当然我们经常见的还是小写,风韵犹存哦。说了这么多,然并卵,和我们今天的主题有鸟关系?
好了,是这样的。jdk1.8中新增的核心特性有lambda表达式(哈哈,原来你也在这里),函数式接口,流API,默认方法,新的Date,以及Time API。下面给大家介绍的是Lambda表达式,该表达式允许我们把行为传到函数里。之前把行为传到函数里我们采用的是匿名内部类,该方法导致行为最重要的方法夹杂在中间,不够突出,详见举例中代码。
lambda表达式取代了匿名内部类,取消了模板,允许程序猿用函数式风格编写代码,使代码可读性更高,尽管刚开始你会看不懂,但是你应该尝试,毕竟这是新的东西,我已从中获益。
格式
基本格式是:() -> {}
有下面三种具体表达:
(params) -> expression
(params) -> statement
(params) -> {statement}
这个新的特性是激动人心的,那么有个问题,怎么用,是啊,很多东西我们都懂,但为什么还是过不好这一生,说远了,问题的关键是:用,得用,你还得会用。
二、lambda使用举例
1、as里的配置
要使用lambda,首先必须配置编译环境,这里使用的android studio,as默认的jdk版本是1.6,修改成1.8即可使用,这里确保你系统安装了jdk1.8,否则需要用到下面插件:gradle-retrolambda
as里的配置有两种方法:
a、配置gradle脚本
在build.gradle脚本中添加下列代码:
[code]android {
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
}[/code]
当然写成下面的样子也是可以的
[code]android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}[/code]
b、设置项目结构
按快捷键Ctrl+Shift+Alt+S进入项目结构设置,把app的jdk版本修改成1.8,注意你需要填写1.8,因为那个下拉菜单里没有这一选项,如下:
这里采用的是第二种方法,然后项目自动同步。
同步后是会在build.gradle脚本下生成和上面一样的东东:
2、举例
a、点击按钮触发事件
传统的点击事件,应用匿名内部类:
[code]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();
}
});[/code]
通过上面设置jdk版本为1.8后,鼠标放到new View.OnClickListener()里会有下面提示:
然后我们按快捷键Alt+Enter,是这样的
继续回车后,见证奇迹的时刻到来lo。。。
使用lambda表达式之后是这样的
[code]Button button = (Button) findViewById(R.id.btn_insert);
button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show());[/code]
一行代码就搞定了,清晰可见,把行为传到了函数里,这里注意v不可省略,是函数onClick的参数,当然就可以是任意名字,我还是建议就用一个字母表示,简单嘛,当然了首先你得知道她的意思,尽管她的很多行为你始终不会明白,哈哈。
b、实现Runnable接口
传统实现Runnable接口是这样的:
[code]new Thread(new Runnable() {
@Override
public void run() {
Log.i("TAG", "haha");
}
}).start();[/code]
使用lambda表达式之后是这样的:
[code]new Thread(() -> {
Log.i("TAG", "haha");
}).start();[/code]
哇哦,是不是有种很清爽的感觉,乍一看,这是什么鬼,仔细分析后是用了lambda表达式() -> {},哈哈,简单的爱,这是程序员懒惰的一种体现,可以写出更简洁高校的代码,赞一个。
3、比较
既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析。
第一个关键的不同点就是关键字 this。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向包围lambda表达式的类。
第二是编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。
三、总结
lambda表达式还有很多用法,比如迭代器,详细用法请参考这里:[url=http://www.importnew.com/16436.html]Java8 lambda表达式10个示例[/url]
好了,希望你们喜欢!!!
原帖见我的简书:[url=http://www.jianshu.com/p/5fc2b3362702]你好,我是简书[/url]
一、Lambda表达式
Lambda,是不是听着很熟悉,没错,在高等数学中这货经常和我们打交道,哈哈,这是一个希腊字母了,排名第十一,大写是Λ,小写是λ,当然我们经常见的还是小写,风韵犹存哦。说了这么多,然并卵,和我们今天的主题有鸟关系?
好了,是这样的。jdk1.8中新增的核心特性有lambda表达式(哈哈,原来你也在这里),函数式接口,流API,默认方法,新的Date,以及Time API。下面给大家介绍的是Lambda表达式,该表达式允许我们把行为传到函数里。之前把行为传到函数里我们采用的是匿名内部类,该方法导致行为最重要的方法夹杂在中间,不够突出,详见举例中代码。
lambda表达式取代了匿名内部类,取消了模板,允许程序猿用函数式风格编写代码,使代码可读性更高,尽管刚开始你会看不懂,但是你应该尝试,毕竟这是新的东西,我已从中获益。
格式
基本格式是:() -> {}
有下面三种具体表达:
(params) -> expression
(params) -> statement
(params) -> {statement}
这个新的特性是激动人心的,那么有个问题,怎么用,是啊,很多东西我们都懂,但为什么还是过不好这一生,说远了,问题的关键是:用,得用,你还得会用。
二、lambda使用举例
1、as里的配置
要使用lambda,首先必须配置编译环境,这里使用的android studio,as默认的jdk版本是1.6,修改成1.8即可使用,这里确保你系统安装了jdk1.8,否则需要用到下面插件:gradle-retrolambda
as里的配置有两种方法:
a、配置gradle脚本
在build.gradle脚本中添加下列代码:
[code]android {
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
}[/code]
当然写成下面的样子也是可以的
[code]android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}[/code]
b、设置项目结构
按快捷键Ctrl+Shift+Alt+S进入项目结构设置,把app的jdk版本修改成1.8,注意你需要填写1.8,因为那个下拉菜单里没有这一选项,如下:
这里采用的是第二种方法,然后项目自动同步。
同步后是会在build.gradle脚本下生成和上面一样的东东:
2、举例
a、点击按钮触发事件
传统的点击事件,应用匿名内部类:
[code]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();
}
});[/code]
通过上面设置jdk版本为1.8后,鼠标放到new View.OnClickListener()里会有下面提示:
然后我们按快捷键Alt+Enter,是这样的
继续回车后,见证奇迹的时刻到来lo。。。
使用lambda表达式之后是这样的
[code]Button button = (Button) findViewById(R.id.btn_insert);
button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show());[/code]
一行代码就搞定了,清晰可见,把行为传到了函数里,这里注意v不可省略,是函数onClick的参数,当然就可以是任意名字,我还是建议就用一个字母表示,简单嘛,当然了首先你得知道她的意思,尽管她的很多行为你始终不会明白,哈哈。
b、实现Runnable接口
传统实现Runnable接口是这样的:
[code]new Thread(new Runnable() {
@Override
public void run() {
Log.i("TAG", "haha");
}
}).start();[/code]
使用lambda表达式之后是这样的:
[code]new Thread(() -> {
Log.i("TAG", "haha");
}).start();[/code]
哇哦,是不是有种很清爽的感觉,乍一看,这是什么鬼,仔细分析后是用了lambda表达式() -> {},哈哈,简单的爱,这是程序员懒惰的一种体现,可以写出更简洁高校的代码,赞一个。
3、比较
既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析。
第一个关键的不同点就是关键字 this。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向包围lambda表达式的类。
第二是编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。
三、总结
lambda表达式还有很多用法,比如迭代器,详细用法请参考这里:[url=http://www.importnew.com/16436.html]Java8 lambda表达式10个示例[/url]
好了,希望你们喜欢!!!
我来回答
回答5个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2008-07-11 20:54:08
-
2018-10-17 15:55:28
-
2016-11-09 11:18:13
-
2015-08-19 21:45:26
-
2015-08-05 18:29:58
-
2015-08-08 20:31:20
-
2015-08-09 20:39:38
-
2015-08-21 16:53:44
-
32015-08-17 20:38:04
-
12012-12-05 13:50:51
-
2015-08-07 21:22:46
-
2012-12-05 11:12:01
-
2020-11-11 10:09:54
-
2015-08-05 14:51:39
-
2015-12-09 13:18:28
-
2015-09-16 19:57:52
-
2020-04-17 16:24:01
-
02012-12-05 13:47:30
-
2015-08-05 18:05:47
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
50帮忙解决个交叉编译的问题
-
20帮忙交叉编译个源码
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认