简介

lambda表达式作为java8的新特性,面向函数式编程,使代码更加简洁,同时也提高编程效率;我们作为开发者,不仅要学会用,还要理解其背后的运作原理

lambda一般使用

lambda使用的规则大致为:
( 参 数 ) − > { 代 码 主 体 } (参数) -> \{ 代码主体 \} (参数)−>{代码主体}
左边括号不是必须的,当只有一个参数时可以省略;右侧大括号也不是必须的,如果只有一行代码,可以省略
在MainActivity页面获取权限的小例子:

private void getPermission(){RxPermissions permissions = new RxPermissions(this);permissions.request(Manifest.permission.CAMERA,Manifest.permission.INTERNET,).subscribe(aBoolean -> {if(!aBoolean){Toast.makeText(this, "未授权权限,部分功能不能使用", Toast.LENGTH_SHORT).show();}});
}

-> 左侧参数aBoolean,右侧是执行的代码主体;
确实比以前代码少了很多,如果按照以前的代码来实现的话,就像下面这样:

.subscribe(new Consumer<Boolean>() {@Overridepublic void accept(Boolean aBoolean) throws Exception {Toast.makeText(MainActivity.this, "....", Toast.LENGTH_SHORT).show();}
});

那这个lambda表达式是如何实现的?
我从逆向的角度来看看,将apk使用apktool工具逆向破解查看其smali代码:
在getPermission方法内:

.method private getPermission()V.locals 4.line 116new-instance v0, Lcom/tbruyelle/rxpermissions2/RxPermissions;invoke-direct {v0, p0}, Lcom/tbruyelle/rxpermissions2/RxPermissions;-><init>(Landroid/support/v4/app/FragmentActivity;)V#部分省略...# 这里new了一个内部类-$$Lambda$MainActivity$ccTQ_-iN8ZWh9xOrzs2GmyGpyIcnew-instance v2, Lcom/iot/chinamobile/-$$Lambda$MainActivity$ccTQ_-iN8ZWh9xOrzs2GmyGpyIc;invoke-direct {v2, p0}, Lcom/iot/chinamobile/-$$Lambda$MainActivity$ccTQ_-iN8ZWh9xOrzs2GmyGpyIc;-><init>(Lcom/iot/chinamobile/MainActivity;)V.line 120# 订阅传入了v2,也就是上面创建的内部类invoke-virtual {v1, v2}, Lio/reactivex/Observable;->subscribe(Lio/reactivex/functions/Consumer;)Lio/reactivex/disposables/Disposable;.line 125return-void
.end method

上面smali代码大致意思是,创建了一个内部类-$$Lambda$MainActivity$ccTQ_-iN8ZWh9xOrzs2GmyGpyIc,并且最后这个内部类订阅了权限的监听回调;那我们进入这个内部类看看

.class public final synthetic Lcom/iot/chinamobile/-$$Lambda$MainActivity$ccTQ_-iN8ZWh9xOrzs2GmyGpyIc;
.super Ljava/lang/Object;
.source "lambda"# interfaces
//实现了Consumer接口
.implements Lio/reactivex/functions/Consumer;# virtual methods
//重写了accept方法
.method public final accept(Ljava/lang/Object;)V.locals 1iget-object v0, p0, Lcom/iot/chinamobile/-$$Lambda$MainActivity$ccTQ_-iN8ZWh9xOrzs2GmyGpyIc;->f$0:Lcom/iot/chinamobile/MainActivity;check-cast p1, Ljava/lang/Boolean;# 又去掉了MainActivity里面的方法lambda$getPermission$0invoke-static {v0, p1}, Lcom/iot/chinamobile/MainActivity;->lambda$getPermission$0(Lcom/iot/chinamobile/MainActivity;Ljava/lang/Boolean;)Vreturn-void
.end method

上述代码大致意思是在当前内部类实现了Comsumer接口,这也是为什么权限订阅者可以订阅成功原因,最后又回去调用了MainActivity的lambda$getPermission$0方法;这个方法是什么呢?不要怕麻烦,最后一步了,在看看:

也就是java代码的这块:

if(!aBoolean){Toast.makeText(this, "未授权权限,部分功能不能使用", Toast.LENGTH_SHORT).show();

原理总结

lambda底层实质就是创建了一个内部类,同时在使用lambda表达式的类中生产一个静态方法,这个静态方法就是lambda的代码主题;由生产的内部类在重写接口方法中去调用;而这个内部类就传递给使用lambda的调用者;如下图

以上就是lambda的内部实现原理,其实现手段和第二种自己去new Comsumer一样的;在代码编写程面帮我们减少了很多工作,底层帮我们自动实现;其实比自己去new内部类还多了一个步骤,自己new时,在上图不会有第2步骤,因为会把第2个步骤的方法中代码移动到内部类的accept方法中去,减少一步调用逻辑

最终,如何取舍,仁者见仁,智者见智!

Java lambda表达式理解相关推荐

  1. Lambda表达式的生动理解以及Java Lambda表达式常见使用场景

    本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明. Lambda 表达式怎么来的? ...

  2. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

  3. Java Lambda表达式的箭头理解总结

    Java Lambda表达式的箭头理解总结 文章目录 Java Lambda表达式的箭头理解总结 一.简单的Lambda的基础知识点: 二.Lambda 表达式示例 1.实现方法没有参数,无返回值的情 ...

  4. Java Lambda表达式初探

    前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...

  5. Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记

    Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...

  6. Java——Lambda表达式

    目录 lambda表达式 lambda表达式 1.什么是lambda? Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简 ...

  7. Java Lambda表达式入门 1

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53930569 文章出自:薛瑄博客 我对Java 8发布非常激动,尤其是lambda ...

  8. Java Lambda表达式入门

    本文转自:http://blog.csdn.net/renfufei... 转载请注明出处 原文链接: Start Using Java Lambda Expressions 下载示例程序 Examp ...

  9. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

最新文章

  1. 《团队开发一(求一个数组的连续的子数组之和的最大值)》
  2. 利用curl命令测试服务端
  3. (pytorch-深度学习系列)深度卷积神经网络AlexNet
  4. 重庆新建建筑中绿色建材应用比例超过70%
  5. 动态拼接Lambda表达式2
  6. 计算机教程无线路由器桥接上网,两个路由器无线桥接
  7. 概率统计D 07.03 正态总体均值与方差的置信区间
  8. 拉里·佩奇(Larry Page)的伟大归来
  9. python简易版成绩管理系统_Python学生成绩管理系统简洁版
  10. 环境配置 python 3.6+Anaconda+cuda9.0+cudNN7.0+Tensorflow
  11. Zookeeper ZAB协议中FLE选举通信流程
  12. 我用一根网线,控制了整栋楼的网络
  13. Mathorcup数学建模竞赛第六届-【妈妈杯】B题:车位分布的优化设计与评价(附一等奖获奖论文和matlab代码)
  14. 嵌入式设备的通讯--秉火STM32学习笔记
  15. Win7 64位系统USB免驱设备驱动识别失败解决方法
  16. 海天蚝油《挑战不可能》听算神童挑战极限20笔9位数闪电心算
  17. 双烤伤电脑吗,双烤CPU温度多少正常
  18. 基于单片机的六层电梯设计
  19. 分布式存储综述与方案选型
  20. 干货分享 | 数据分析资源,应有尽有!

热门文章

  1. 不死的Eternal Blue(永恒之蓝)
  2. 画线(Drawing lines)
  3. 《你好,李焕英》爆红背后:恒腾网络价值亟待重估
  4. frida hook嘟嘟牛在线
  5. Windows更新出现8024402f错误代码的解决方法
  6. 计算几何(一):点,向量
  7. 新的微信花式昵称!给你的微信昵称加上边框,与众不同!
  8. aab取A abb取B php,AAB式 AABB式 ABB 大A大B 又A又B 有A有B式词语大全
  9. 服刑人员有钱不缴罚金 法院裁定不予减刑
  10. 【ROG】解决ROG笔记本外接显示器间歇性黑屏 |重装显卡驱动