Java lambda表达式理解
简介
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表达式理解相关推荐
- Lambda表达式的生动理解以及Java Lambda表达式常见使用场景
本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明. Lambda 表达式怎么来的? ...
- 深入理解Java Lambda表达式,匿名函数,闭包
前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...
- Java Lambda表达式的箭头理解总结
Java Lambda表达式的箭头理解总结 文章目录 Java Lambda表达式的箭头理解总结 一.简单的Lambda的基础知识点: 二.Lambda 表达式示例 1.实现方法没有参数,无返回值的情 ...
- Java Lambda表达式初探
前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...
- Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记
Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...
- Java——Lambda表达式
目录 lambda表达式 lambda表达式 1.什么是lambda? Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简 ...
- Java Lambda表达式入门 1
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53930569 文章出自:薛瑄博客 我对Java 8发布非常激动,尤其是lambda ...
- Java Lambda表达式入门
本文转自:http://blog.csdn.net/renfufei... 转载请注明出处 原文链接: Start Using Java Lambda Expressions 下载示例程序 Examp ...
- java拉姆达表达式事例,Java Lambda表达式详解和实例
简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...
最新文章
- 《团队开发一(求一个数组的连续的子数组之和的最大值)》
- 利用curl命令测试服务端
- (pytorch-深度学习系列)深度卷积神经网络AlexNet
- 重庆新建建筑中绿色建材应用比例超过70%
- 动态拼接Lambda表达式2
- 计算机教程无线路由器桥接上网,两个路由器无线桥接
- 概率统计D 07.03 正态总体均值与方差的置信区间
- 拉里·佩奇(Larry Page)的伟大归来
- python简易版成绩管理系统_Python学生成绩管理系统简洁版
- 环境配置 python 3.6+Anaconda+cuda9.0+cudNN7.0+Tensorflow
- Zookeeper ZAB协议中FLE选举通信流程
- 我用一根网线,控制了整栋楼的网络
- Mathorcup数学建模竞赛第六届-【妈妈杯】B题:车位分布的优化设计与评价(附一等奖获奖论文和matlab代码)
- 嵌入式设备的通讯--秉火STM32学习笔记
- Win7 64位系统USB免驱设备驱动识别失败解决方法
- 海天蚝油《挑战不可能》听算神童挑战极限20笔9位数闪电心算
- 双烤伤电脑吗,双烤CPU温度多少正常
- 基于单片机的六层电梯设计
- 分布式存储综述与方案选型
- 干货分享 | 数据分析资源,应有尽有!