Lambda 表达式详解~简化匿名内部类

本节将介绍如何使用Lambda表达式简化匿名内部类的书写,但Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写。先别在乎细节,看几个例子再说。

例子1:无参函数的简写

如果需要新建一个线程,一种常见的写法是这样:

// JDK7 匿名内部类写法
new Thread(new Runnable(){// 接口名@Overridepublic void run(){// 方法名System.out.println("Thread run()");}
}).start();

上述代码给Tread类传递了一个匿名的Runnable对象,重载Runnable接口的run()方法来实现相应逻辑。这是JDK7以及之前的常见写法。匿名内部类省去了为类起名字的烦恼,但还是不够简化,在Java 8中可以简化为如下形式:

// JDK8 Lambda表达式写法
new Thread(() -> System.out.println("Thread run()")// 省略接口名和方法名
).start();

上述代码跟匿名内部类的作用是一样的,但比匿名内部类更进一步。这里连接口名和函数名都一同省掉了,写起来更加神清气爽。如果函数体有多行,可以用大括号括起来,就像这样

// JDK8 Lambda表达式代码块写法
new Thread(() -> {System.out.print("Hello");System.out.println(" Hoolee");}
).start();

例子2:带参函数的简写

如果要给一个字符串列表通过自定义比较器,按照字符串长度进行排序,Java 7的书写形式如下:

// JDK7 匿名内部类写法
List<String> list = Arrays.asList("I", "love", "you", "too");
Collections.sort(list, new Comparator<String>(){// 接口名@Overridepublic int compare(String s1, String s2){// 方法名if(s1 == null)return -1;if(s2 == null)return 1;return s1.length()-s2.length();}
});

上述代码通过内部类重载了Comparator接口的compare()方法,实现比较逻辑。采用Lambda表达式可简写如下:

// JDK8 Lambda表达式写法
List<String> list = Arrays.asList("I", "love", "you", "too");
Collections.sort(list, (s1, s2) ->{// 省略参数表的类型if(s1 == null)return -1;if(s2 == null)return 1;return s1.length()-s2.length();
});

上述代码跟匿名内部类的作用是一样的。除了省略了接口名和方法名,代码中把参数表的类型也省略了。这得益于javac类型推断机制,编译器能够根据上下文信息推断出参数的类型,当然也有推断失败的时候,这时就需要手动指明参数类型了。注意,Java是强类型语言,每个变量和对象都必需有明确的类型。

简写的依据

也许你已经想到了,能够使用Lambda的依据是必须有相应的函数接口(函数接口,是指内部只有一个抽象方法的接口)。这一点跟Java是强类型语言吻合,也就是说你并不能在代码的任何地方任性的写Lambda表达式。实际上Lambda的类型就是对应函数接口的类型Lambda表达式另一个依据是类型推断机制,在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指名。Lambda表达更多合法的书写形式如下:

// Lambda表达式的书写形式
Runnable run = () -> System.out.println("Hello World");// 1
ActionListener listener = event -> System.out.println("button clicked");// 2
Runnable multiLine = () -> {// 3 代码块System.out.print("Hello");System.out.println(" Hoolee");
};
BinaryOperator<Long> add = (Long x, Long y) -> x + y;// 4
BinaryOperator<Long> addImplicit = (x, y) -> x + y;// 5 类型推断

上述代码中,1展示了无参函数的简写;2处展示了有参函数的简写,以及类型推断机制;3是代码块的写法;4和5再次展示了类型推断机制。

自定义函数接口

自定义函数接口很容易,只需要编写一个只有一个抽象方法的接口即可。

// 自定义函数接口
@FunctionalInterface
public interface ConsumerInterface<T>{void accept(T t);
}

上面代码中的@FunctionalInterface是可选的,但加上该标注编译器会帮你检查接口是否符合函数接口规范。就像加入@Override标注会检查是否重载了函数一样。

有了上述接口定义,就可以写出类似如下的代码:

ConsumerInterface<String> consumer = str -> System.out.println(str);

进一步的,还可以这样使用:

class MyStream<T>{private List<T> list;...public void myForEach(ConsumerInterface<T> consumer){// 1for(T t : list){consumer.accept(t);}}
}
MyStream<String> stream = new MyStream<String>();
stream.myForEach(str -> System.out.println(str));// 使用自定义函数接口书写Lambda表达式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

app store 服务器维护,AppStore无法连接怎么办?几个小方法教你解决问题

原标题&#xff1a;AppStore无法连接怎么办&#xff1f;几个小方法教你解决问题苹果用户都知道&#xff0c;AppStore我们下载应用的地方&#xff0c;无论是自带软件还是第三方软件都能在这里找到。但是有时候我们会遇上AppStore无法理解的问题&#xff01;简单来说&#xff0c;…

Python Twisted 介绍

Python Twisted介绍&#xff1a;http://blog.csdn.net/hanhuili/article/details/9389433 原文链接&#xff1a;http://www.aosabook.org/en/twisted.html 作者&#xff1a;Jessica McKellar Twisted 是用 Python 实现的 基于事件驱动 的 网络引擎框架&#xff0c;即一个 网络…

Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'

数据库用的是access&#xff0c;症状是 首页&#xff0c;列表页可以显示&#xff0c;但是内容页无显示 错误如下&#xff1a; Microsoft OLE DB Provider for ODBC Drivers 错误 80004005 readnews.asp 23行 我打开目录 找到readnews.aspx 页面发现&#xff0c;原来23行是一条:…

基于互联网大脑架构的阿里巴巴未来趋势分析【系列2】

作者 刘锋 《互联网进化论》作者&#xff0c;计算机博士前言在计算机科学中&#xff0c;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调…

Lambda 表达式详解~深入JVM实现原理

读过上一篇之后&#xff0c;相信对Lambda表达式的语法以及基本原理有了一定了解。对于编写代码&#xff0c;有这些知识已经够用。本文将进一步区分Lambda表达式和匿名内部类在JVM层面的区别&#xff0c;如果对这一部分不感兴趣&#xff0c;可以跳过。 经过第一篇的的介绍&…

从别的网站服务器获取数据,使用get()方法以GET方式从服务器获取数据

使用get()方法以GET方式从服务器获取数据我的个人资料$(function () {$("#btnShow").bind("click", function () {var $this $(this);? {$this.attr("disabled", "true");$("ul").append("我的名字叫&#xff1a;&qu…

关于Linq to DataSet

代码 privatePagedDataSource BindMethod(PagedDataSource pds, stringkeyword) { OthersTradeBo bo null; try{ bo newOthersTradeBo(); DataSet ds responseDataSet(bo); DataTable dt ds.Tables…

Twisted 入门 教程

GitHub 地址&#xff1a;https://github.com/likebeta/twisted-intro-cn/tree/master/zh https://github.com/luocheng/twisted-intro-cn 示例代码&#xff1a;https://github.com/jdavisp3/twisted-intro Twisted 与 异步编程入门 系列&#xff08; 英文 &#x…

OpenAI详细解析:攻击者是如何使用「对抗样本」攻击机器学习的

原文来源&#xff1a;OpenAI作者&#xff1a; Ian Goodfellow、Nicolas Papernot、Sandy Huang、Yan Duan、Pieter Abbeel、Jack Clark.「雷克世界」编译&#xff1a;嗯~是阿童木呀、EVA导语&#xff1a;一般来说&#xff0c;对抗样本&#xff08;adversarial examples&#xf…

Lambda 表达式详解~Lambda与集合

我们先从最熟悉的*Java集合框架(Java Collections Framework, JCF)*开始说起。 为引入Lambda表达式&#xff0c;Java8新增了java.util.funcion包&#xff0c;里面包含常用的函数接口&#xff0c;这是Lambda表达式的基础&#xff0c;Java集合框架也新增部分接口&#xff0c;以便…

轩辕传奇服务器合并信息,轩辕传奇9月1日部分服务器合服公告

轩辕传奇9月1日部分服务器合服公告带个大家&#xff0c;这个更新后服务器合服公告都有哪些内容呢&#xff0c;下面就一起去看看吧。尊敬的轩辕勇士们&#xff1a;《轩辕传奇》开放测试以来人气依旧沸腾&#xff0c;各种战斗的激烈程度也随之升级!为了让勇士们尽享更刺激、更热血…

Java和.NET互操作:应该放弃Web Service吗

通过Web Service混合.NET和Java技术往往很容易&#xff0c;但Web Service并非是.NET和Java互操作的万灵丹。Web Service在集成独立的跨网络通信的组件时非常有用&#xff0c;在简单的调用/返回情景中&#xff0c;涉及的数据类型数量非常有限&#xff0c;且Web Service是基于标准…

京东AI战略宏图展现 不枉挖来这么多AI大牛

来源&#xff1a;网易科技4月15日下午&#xff0c;京东人工智能创新峰会在北京举行。这次会议虽然规模不大&#xff0c;但是堪称重磅&#xff0c;一是在这次会议上京东AI带头人周伯文首次向外界展示京东在AI领域的战略布局与发展方向&#xff1b;二是AI领域重量级人物周志华等大…

Lambda 表达式详解~Streams API~Stream常见接口方法

你可能没意识到Java对函数式编程的重视程度&#xff0c;看看Java 8加入函数式编程扩充多少功能就清楚了。Java 8之所以费这么大功夫引入函数式编程&#xff0c;原因有二&#xff1a; 代码简洁函数式编程写出的代码简洁且意图明确&#xff0c;使用stream接口让你从此告别for循环…

ajax脚本格式,jQuery ajax调用 - jim脚本响应是什么格式?

对不起&#xff0c;如果这已被回答&#xff0c;但我搜索网络和本网站&#xff0c;我找不到答案...jQuery ajax调用 - jim脚本响应是什么格式&#xff1f;我有一个JavaScript函数&#xff0c;调用jim脚本来执行各种SQLite数据库查询。这是js函数&#xff1a;insertRecord: funct…

Scrapy源码阅读分析_1_整体框架和流程介绍

From&#xff1a;https://blog.csdn.net/weixin_37947156/article/details/74435304 Scrapy github 下载地址&#xff1a;https://github.com/scrapy/scrapy 介绍 Scrapy是一个基于Python编写的一个开源爬虫框架&#xff0c;它可以帮你快速、简单的方式构建爬虫&#xff0c;并…

Waymo正式向真正“无人车”迈进,申请DMV远程监控许可证

作者 &#xff1a; DudeWaymo 又向前迈出一大步&#xff0c;真正迈向“无人车”&#xff0c;测试的自动驾驶车辆将不配备安全驾驶员。据报道&#xff1a;Waymo已经向加州车管局提出了申请&#xff0c;Waymo官方也证实了媒体报道&#xff0c;而DMV方面称&#xff0c;在申请提交后…

或者是修改服务器时间,修改云服务器时间设置

修改云服务器时间设置 内容精选换一换云服务器的系统盘在创建云服务器时自动创建并挂载&#xff0c;无需单独购买。数据盘可以在购买云服务器的时候一同购买&#xff0c;由系统自动挂载给云服务器。也可以在购买了云服务器之后&#xff0c;单独购买云硬盘并挂载给云服务器。本节…

Lambda 表达式详解~Streams API~规约操作

上一节介绍了部分Stream常见接口方法&#xff0c;理解起来并不困难&#xff0c;但Stream的用法不止于此&#xff0c;本节我们将仍然以Stream为例&#xff0c;介绍流的规约操作。 规约操作&#xff08;reduction operation&#xff09;又被称作折叠操作&#xff08;fold&#x…

Scrapy源码阅读分析_2_启动流程

From&#xff1a;https://blog.csdn.net/weixin_37947156/article/details/74436333 使用 PyCharm 打开下载好的 Scrapy 源码&#xff08;github&#xff1a;https://github.com/scrapy/scrapy&#xff09; scrapy命令 当用 scrapy 写好一个爬虫后&#xff0c;使用 scrapy craw…