当前位置: 首页 > news >正文

理解lambda表达式

Lambda表达式:
这里不再过多叙述什么事lambda表达式,就说下怎么使用,首先和lambda表达式同时存在的就是另一个定义,就是匿名内部类。匿名内部类首先需要一个接口。
下面用一个例子说明lambda表达式:

public class HelloWorld{public static void main(String[] args){String name = "cat";Animal cat = new Animal(name, ()->{System.out.println("Hello, I'm a " + name + "!");});}public static interface Talk {void talks();}public static class  Animal {public String name ;public Animal(String names, Talk talks) {this.name = names;talks.talks();}}
}

这里的接口就是Talk,该接口只是申明了一个功能,talks; 但是至于这个方法的实现就是lambda表达式的精髓所在,这个方法的具体实现,我们可以放在使用这个方法的时候再去实现。
如上所述代码,该方法是在初始化Animal对象的时候才实现的,这就和以往的方法不同,以往都是先定义方法的函数体,然后再使用。这里反而是到使用的时候再定义,这不就可以根据我们的场景来定义方法的功能了嘛。
这就是可以实现,根据不同场景采用不同策略应对的功能。 比如导师给你安排个任务,然后告诉你说有困难你再去找XX师兄师姐。 这里就是一个场景加一个方法的组合,场景是有困难,然后方法时去找师兄师姐,但是场景很多啊,你可能刚上手就不会,也可能是做到一半遇到问题,亦或者是做到最后一步,不知道怎么总结,那你请教的内容必然也不会相同。所以会根据场景确定问题。这里场景就是一个对象(Animal),实例化一个场景,然后根据场景实现请教这个接口中的详细方法(talk)。
这就是我理解的lambda表达式最直观的一个使用场景,当然这里完全可以用匿名内部类解决,上面的初始化方法换成如下即可。

Animal dog = new Animal(name,  new Talk() {@Overridepublic void talks(){System.out.println("Hello, I'm a " + name + "!");}});

Lambda表达式只是简化了这里的表达形式,这里可以这么理解,

Talk talks = new Talk() {@Overridepublic void talks(){System.out.println("Hello, I'm a " + name + "!");}};

然后这里的就是直接将等号左边当成了参数放入初始化函数中。而lambda表达式就是在这个基础上再次简化,可以写成下面的格式:

(参数) -> {方法体;}

这里的talks方法是无参函数,所以就直接传一个 () 再加上符号 -> 然后通过{}将方法体包含住,所以在看到lambda表达式的时候,如果还不熟悉,不理解其含义,可以先将其逆转为匿名内部类,这样就会好理解很多。

下面就在Android代码中找一个例子:

private final Comparator<WindowState> mWindowComparator =(WindowState newWindow, WindowState existingWindow) -> {final WindowToken token = WindowToken.this;if (newWindow.mToken != token) {throw new IllegalArgumentException("newWindow=" + newWindow+ " is not a child of token=" + token);}if (existingWindow.mToken != token) {throw new IllegalArgumentException("existingWindow=" + existingWindow+ " is not a child of token=" + token);}return isFirstChildWindowGreaterThanSecond(newWindow, existingWindow) ? 1 : -1;
};

就找到之前Window相关内容中的排序算法作为例子,这里的mWindowComparator是一个泛型为WindowState的Comparator,然后初始化的时候看到了等号邮编就是一个lambda表达式。
这个lambda表达式参数列表为(WindowState, WindowState),这两个WindowState分别是待比较的两个量,再看后面的方法体,即{}中包含的地方,首先是确认newWindow是不是和队列中的WindowState属于同一个聚类(即mToken属性相同),再确认待比较的exitingWindowstate是否是同一个聚类,然后再调用isFirstChildWindowGreaterThanSecond()方法进行比较。那这里怎么理解呢?
首先匿名内部类,要找到一个接口,接口很好找,就是需要实现方法体的那个东西,所以这里就是Comparator,看定义,确实是一个接口。
那重写成匿名内部类就是下面的模式:

Comparator<WindowState> mWindowComparator = new Comparator<WindowState>() { @Overrideint compare(WindowState newWindow,WindowState existingWindow ){return isFirstChildWindowGreaterThanSecond(newWindow, existingWindow) ? 1 : -1;}};

这样就比较好理解lambda表达式了,他就是重写了这个compare方法而已。所以遇到不是很好理解的lambda表达式,就先还原成匿名内部类形式,这样就能方便理解一点,等熟悉后其实也不用这么麻烦了,一般都能直接看明白

不过之前还遇到一个比较奇怪的lambda表达式形式,不太常见,就是 :: 这个符号。双冒号在c++中遇到的多一点,可代表某个某个域的函数或类型,在lambda表达式中好像也差不多,在Android代码中就有用到这个功能:

private final Comparator<WindowToken> mWindowComparator =Comparator.comparingInt(WindowToken::getWindowLayerFromType);

这里就代表着调用了WindowToken这个类中的getWindowLayerFromType方法。

相关文章:

  • 在本地电脑中如何用命令操作远程服务器上的数据库
  • [力扣题解] 28. 找出字符串中第一个匹配项的下标
  • 【算法】模拟算法——Z字形变换(medium)
  • Python魔法之旅-魔法方法(08)
  • BearPi-HM Nano开发笔记
  • LiveWeb前端:深度解析与挑战应对
  • net语言编程:深入探索其奥秘与挑战
  • 说说影响网络的因素
  • Java网络编程(上)
  • 【Linux】如何利用linux项目自动化构建工具-make/Makefile以及vim编辑器构建两个小程序:倒计时和进度条
  • go语言基于Gin集成后台管理系统开发定时任务管理cron/v3好用又好看
  • mac 下配置mysql的全局环境变量
  • Spring Cloud Alibaba-09-Seata分布式事务
  • 秋招突击——算法打卡——5/30——复习{最大上升子序列的和、面试算法缺陷补充}——新做:{回文数+补充 自定义Stoi实现、正则表达式匹配}
  • AI科技,赋能企业财务管理
  • 【Amaple教程】5. 插件
  • 2017-09-12 前端日报
  • 5、React组件事件详解
  • 77. Combinations
  • Angular 响应式表单 基础例子
  • js
  • js继承的实现方法
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • webgl (原生)基础入门指南【一】
  • windows下如何用phpstorm同步测试服务器
  • 从输入URL到页面加载发生了什么
  • 简析gRPC client 连接管理
  • 前端面试之CSS3新特性
  • 如何设计一个微型分布式架构?
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 小程序开发中的那些坑
  • ​linux启动进程的方式
  • #vue3 实现前端下载excel文件模板功能
  • $.ajax()
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (poj1.3.2)1791(构造法模拟)
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (学习日记)2024.01.19
  • (转)大型网站架构演变和知识体系
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core跨平台微服务学习资源
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .netcore如何运行环境安装到Linux服务器
  • .NET开发者必备的11款免费工具
  • .NET中使用Redis (二)
  • @JoinTable会自动删除关联表的数据