什么是Lambda语法?为什么使用Lambda?Lambda的优点是什么?我该如何在开发中使用呢?
嗯嗯,相信你早听说过Lambda的大名了,别急别急,小兄弟听我娓娓道来
lambda表达式,它将允许我们将行为传到函数里。在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码。而定义行为最重要的那行代码,却混在中间不够突出。Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样有时可读性更好,表达更清晰。
Lambda的优点是什么?优点就是代码简洁
为什么使用Lambda?还是简洁
比如我们开发点击事件写法
tvSensors.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.print("我要点击"); } });看到没,六行代码,有用的仅有那句打印语句,你会说虽然复杂了点,但我一般不这么写,我只要在监听里面写this,让那个父类实现方法,我只要在onclick方法写具体行为就可以了,比如这样
mBtn_search.setOnClickListener(this); mBtn_confirm.setOnClickListener(this);嗯,这样看起来貌似这样好像很简洁,那如果我们使用线程呢?
new Thread(new Runnable() { @Override public void run() { System.out.print("打印到控制台...啦啦啦"); } }).start();你还能写个this么,就算能写,如果多个地方用到线程run方法怎么复写?不复写run方法,那要写多个匿名内部类一样臃肿不堪,况且你自定义的接口回调咋办...嗯嗯,看来是绕不过匿名函数6行代码的坎呀
上述例子都是在某个类中实现某个接口,然后传递到另外一个方法中作为参数,然后用来执行。但是本质上,他们要传递的就是接口中那一个方法的实现而已啊!有必要先创建类,再实例化,再传递给调用的位置吗?因为 Java 是纯面向对象的语言,像其他语言那样随随便便传个方法过来,那可不行,必须要这样。
在其他语言中你可能可以,但是,在 Java 中,不可以
Java 设计人员为了 Java 的简洁跟连贯性,一直拒绝为 Java 添加这种功能。
经过多年的努力,开发人员终于找到了符合 Java 编程习惯的 Lambda 表达式!
我们用Lambda表达式重新写一下上面的代码
tvSensors.setOnClickListener(event ->System.out.print("我要点击 "));
new Thread(() -> System.out.print("打印到控制台...啦啦啦")).start();优美的让人窒息啊,甩开往日的冗余写法,阅读性一目了然有木有
大家一定很懵逼,简洁是简洁,但是看得好像似懂非懂啊,骚年别着急,现在就来教大家如何去写Lambda表达式!如果你嫌弃写Lambda语法打特殊符号麻烦,其实studio会帮你自动生成,这个后面我再说
首先介绍一下 Java 中 Lambda 表达式的格式:
(参数) -> 表达式
如果有参数就写上参数如 (String a,String b) -> System.out.print(a+b); //如果参数类型可推断出,可以不写参数类型如果有一个参数
如果没有参数 () - > System.out.print("");
如果有返回值 tvSensors.setOnTouchListener(( v, event) ->true);
如果返回值由方法返回 tvSensors.setOnTouchListener(( v, event) ->False());
如果返回值有多个要加上大括号 tvSensors.setOnTouchListener(( v, event) ->{ if(true) return false; else return true; }
基本上常用的就是这几种用法了,当然了还有其他一些用法,但是要说下,这只是作为了解实际开发中可以装下逼,面试装下逼,但是目前Android开发我好像还没见到人就这么写,所以如果团队开发大家没用Lambda 语法,你也别装逼用了,如果独立开发,比如像我,这么写也不会有人说的
这里给出Lambda 其他的用法
http://zhaochunqi.com/2016/11/15/java_lambda_expressions/
http://blog.csdn.net/ioriogami/article/details/12782141/
在Android Studio中虽然我们使用java1.8进行开发,还不可以使用Lambda,还需要进行配置下如下:
准备工作 jdk1.8以上,studio2.0以上,虽然不知道和stuido是否有关,但最好保持一致,我的studio是2.1.1
最简单的使用方式是在app的gradle中加一句
jackOptions.enabled = true以及这句
compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 }但是要注意了编译版本必须是24以上,否则写代码不会报错但是编译会报错
buildToolsVersion "24.0.0"
我把我的gradle配置上传到了github自己看下,很简单https://github.com/Itxupengfei/appbuildGradler
但是用我这种方式有种缺陷,就是部分功能无法使用
我看到有些人是使用依赖库在studio中使用Lambda语法,配置相对复杂一点点(其实一点也不复杂),但是用我这种完全就够用了简单方便快捷
这里给出第三方插件使用Lambda http://www.tuicool.com/articles/2yuiiyA