jp1017

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017  发布于  2015-09-14 16:29:23
采纳率 0%
78个问答
4562

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]

好了,希望你们喜欢!!!
我来回答
回答5个
时间排序
认可量排序

cs_sos

0个粉丝

9

问答

2

专栏

5

资料

cs_sos 2015-09-14 18:03:48
认可0
报告版主,你这有广告嫌疑呵。

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017 2015-09-14 18:47:45
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=20170&ptid=8746]cs_sos 发表于 2015-9-14 18:03[/url]
报告版主,你这有广告嫌疑呵。[/quote]

在哪里,我改改

goodman

2个粉丝

30

问答

18

专栏

17

资料

goodman 2015-09-15 09:04:35
认可0
lambda总觉得语法怪怪的,记不住!

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017 2015-09-15 09:21:07
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=20184&ptid=8746]goodman 发表于 2015-9-15 09:04[/url]
lambda总觉得语法怪怪的,记不住![/quote]

多用用吧,新东西,好用,简洁,清爽,XXXX:D

fox-cool

0个粉丝

9

问答

0

专栏

0

资料

fox-cool 2015-09-22 21:46:56
认可0
像几种语法的杂交体。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区