如何在Java 8中将Lambda表达式转换为方法引用?

如果您使用Java 8进行编码,那么您会知道使用方法引用代替lambda表达式会使您的代码更具可读性,因此建议尽可能使用方法引用替换lambda表达式,但是,最大的问题是,您如何查找是否可以用方法引用替换lambda? 是的,这并不是那么容易,尤其是如果您仅使用Java 8几个月,并且一直在努力将各种功能性编程概念和习惯用法整理在脑海中。 无论如何,用方法引用替换lambda表达式的简单规则是建立在常识之上的,您将在本文中学习。

如果仔细观察,lambda就是传递给函数执行的代码。 如果您已经具有方法形式的代码,则可以传递方法引用,而不是将新代码作为lambda传递。 就是这样,但是我知道,说起来容易做起来难,因此我提供了许多示例来解释Java 8中的这个概念。

如何用Java 8中的方法参考替换lambda表达式

如果您将lambda表达式用作匿名函数,但不对传入的参数进行任何操作,则可以将lambda表达式替换为方法引用。 下面的代码是用方法参考替换lambda的好例子

listOfNumbers.stream().sorted().forEach(number -> {System.out.println(number);}
);

由于我们这里没有修改number参数,因此可以替换lambda表达式:

number -> { System.out.println(number); 
}

方法参考如下所示:

listOfNumbers.stream().sorted.forEach(System.out::println);

但是,如果您在将参数传递给另一个方法之前修改了该参数,则无法用方法引用替换lambda,例如,在以下情况下,我们无法这样做:

listOfNumbers.stream().sorted().forEach(number -> {System.out.println(String.valueOf(number));}
);

双冒号(::)运算符用于方法引用,实际上有三种主要用法:

object::instanceMethod
Class::staticMethod
Class:instanceMethod

在前两种情况下,方法引用等效于提供方法参数的lambda表达式,例如
System.out :: println等效于
x-> System.out.println(x)和 Math :: pow等效于 (x,y)-> Math.pow(x,y)。

在这种情况下,第一个参数成为方法的目标。 例如,
String :: compareToIgnoreCase与

(x, y) -> x.compareToIgnoreCase(y)

或this :: equals与

(x -> this.equals(x))

您可以阅读有关在Java SE 8中将这种类型的lambda表达式转换为方法参考的更多信息,有关Really Im Patient的内容 ,对此主题有更多的解释和示例。

用方法引用替换lambda表达式的另一个很好的示例是以下代码,该代码在Java 8中按值对映射进行排序 :

Map sortByValue = map.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer>comparingByValue())
.collect(Collectors.toMap(e -> e.getKey(),e -> e.getValue()));

可以使用方法参考重写为以下内容:

Map sortByValue = map.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer>comparingByValue())
.collect(toMap(Map.Entry::getKey,Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

如果您仔细观察,我们将e-> e.getKey()替换为
Map.Entry :: getKey和e-> g.getValue()到
Map.Entry :: getValue,因为我们已经以getKey()和getValue()方法的形式编写了这些lambda表达式所执行的代码。

这就是何时以及如何用Java 8中的方法引用替换lambda表达式的全部内容。 仅在不进行任何修改的情况下才可以替换,否则就不能替换。 为什么要这么做? 好吧,因为方法引用比lambda表达式更简洁易读。

Java 8的新增功能

Java SE 8实在不耐烦

使用Lambda表达式从Java 8中的集合到流

Java 8中用于数据处理的流,收集器和可选项

相关的Java 8教程

如果您有兴趣学习有关Java 8的新功能的更多信息,这是我以前的文章,介绍Java 8的一些重要概念:

  • Java 8中20个日期和时间的示例( 教程 )
  • 从零开始学习Java 8的5本书( 书籍 )
  • 如何在Java 8中连接String( 示例 )
  • 如何在Java 8中使用filter()方法( 教程 )
  • 如何在Java 8中使用LocalDateTime格式化/解析日期? ( 教程 )
  • 如何在Java 8中使用Stream类( 教程 )
  • 如何在Java 8中使用forEach()方法( 示例 )
  • 如何在Java 8中将列表转换为Map( 解决方案 )
  • 如何在Java 8中使用peek()方法( 示例 )
  • 如何在Java 8中按键对地图排序? ( 示例 )
  • Java 8中的Optionals的10个示例? ( 示例 )

感谢您到目前为止阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如果您有任何问题或反馈,请发表评论。

翻译自: https://www.javacodegeeks.com/2017/08/convert-lambda-expression-method-reference-java-8.html

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

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

相关文章

最大化窗口设置_打开表格总是默认窗口最小化?适用Word、PPT等其他应用

今天有小哥哥说每天早上上班打开第一个表格时&#xff0c;这样显示&#xff1b;打开第二个表时是这样显示&#xff1b;每次打开第二个表后点最大化再打开其他的表才正常显示为最大化的状态。其实&#xff0c;这只是表格的默认打开方式改变了&#xff0c;我们改正过来就好了。在…

html5块元素代码,html5 区块与内联div 与span html块级元素(示例代码)

HTML 和 可以通过 和 将 HTML 元素组合起来。HTML 块元素大多数 HTML 元素被定义为块级元素或内联元素。编者注&#xff1a;"块级元素"译为 block level element&#xff0c;"内联元素"译为 inline element。块级元素在浏览器显示时&#xff0c;通常会以新…

html页面js遍历listview,javascript实现的listview效果

javascript实现的listview效果更新时间&#xff1a;2007年04月28日 00:00:00 作者&#xff1a;#oContainer {width: 600px;height: 500px;border: 1px solid menu;margin: 0px;padding: 0px;overflow: hidden;}a {color: black;text-decoration: none;}a:hover {color: red;t…

Apache Ignite本机持久性,简要概述

通过将数据的工作集放入系统内存中&#xff0c;内存中方法可以达到极高的速度。 当所有数据都保存在内存中后&#xff0c;处理使用传统旋转磁盘引起的问题的需求就消失了。 例如&#xff0c;这意味着无需维护数据的其他缓存副本并管理它们之间的同步。 但是这种方法还有一个缺点…

Java命令行界面(第23部分):Rop

Rop库在其主页上被描述为“用Java编写的轻量级命令行选项解析器”。 Rop的“简介”还指出&#xff1a;“ Rop的设计目的是最小化同时方便&#xff0c;并涵盖了大多数常见的命令行解析用例。” 这篇文章是本系列中第23篇有关解析Java命令行参数的文章 &#xff0c;重点是Rop。 …

Java 9,Jigsaw,JPMS和模块:个人探索

Java 9由于Jigsaw项目而延迟了很多次&#xff0c;您可能会听到很多关于模块&#xff0c;模块化和其他内容的信息&#xff0c;那么&#xff0c;它的全部含义是什么&#xff1f; 模块化到底是什么&#xff0c;模块化平台是什么意思&#xff1f; Java平台模块系统&#xff08;JPMS…

仪征市第二中学计算机老师,静心倾听花自开 ——仪征市第二中学徐丞老师

原标题&#xff1a;静心倾听花自开 ——仪征市第二中学徐丞老师徐丞老师是我校一名优秀的青年教师。自2004年从教以来&#xff0c;他满怀对教育事业的真诚&#xff0c;立足本职&#xff0c;默默耕耘&#xff0c;在平凡中成就着不平凡。在教育教学过程中&#xff0c;徐丞老师始终…

智慧物业小程序_刷脸支付+电商小程序+智慧酒店营销方案

我们这边刷脸支付电商小程序智慧酒店行业解决方案&#xff0c;支付宝微信订房小程序&#xff0c;芝麻信用免押住&#xff0c;数字化经营发券引流&#xff0c;未来酒店:0押金 0房费 退房扣款&#xff0c;不占用资金&#xff0c;用户增长信用分&#xff0c;线上订房小程序&#x…

# 字符串从右往左查找_字符串匹配(搜索,查找)算法

(一)前言所谓的字符串匹配就是在一个长字符串(可称文本T)中找一个短字符串(可称模式P)&#xff0c;看长字符串中是否存在短字符串&#xff0c;若存在则返回出现的第一个位置&#xff0c;若不存在则返回一个标记。字符串搜索算法有很多&#xff0c;比较知名的自然是大名鼎鼎Knut…

html5按钮样式具有子项目,如何使用HTML5+css3制作出12种常用的按钮开关样式(附完整代码)...

现如今前端网页的开发越来越注重设计感&#xff0c;这些设计感更体现在细节处&#xff0c;今天向大家具体介绍一下各式各样的开关按钮是如何使用HTML5css3制作出来的&#xff0c;希望可以帮到大家。使用HTML5css3制作按钮开关的原理根据设计的要求填充各种颜色。按钮开关的形状…

Java命令行界面(第17部分):jw-options

JavaWorld文章处理Java中的命令行参数&#xff1a; Matthias Laux博士关闭的案例介绍了一个基于Java的简单库&#xff0c;用于处理命令行参数 &#xff0c;在本文中我将其称为jw-options 。 被引用的文章提供了有关为何在构造Options类时做出某些设计决策的背景信息。 本文的“…

便捷式计算机无线功能按钮,TP-Link TL-MR13U便携式无线路由器Client模式设置

本文介绍了TP-Link TL-MR13U便携式无线路由器&#xff0c;在“客户端模式(Client)”下的设置方法。TL-MR13U工作在“客户端模式(Client)”时&#xff0c;主要作用是用来接收无线WiFi信号&#xff0c;把无线WiFi信号转换为有线网络&#xff0c;实现让台式电脑上网。TP-Link TL-M…

Java命令行界面(第6部分):JOpt简单

JOpt Simple的主页将这个基于Java的库称为“用于解析命令行选项的Java库&#xff0c;例如您可能传递给调用javac的Java库&#xff0c;”该Java库试图“使用POSIX getopt&#xff08;&#xff09;的命令行选项语法&#xff09;和GNU getopt_long&#xff08;&#xff09; 。” 这…

计算机c盘哪些东西可以清理,细说电脑c盘哪些文件可以删除

有些网友反映&#xff0c;自己看C盘里的文件太多了&#xff0c;电脑又太卡&#xff0c;情急之下就把里面的东西删掉了&#xff0c;现在系统都不能用了。为了避免大家再入这个坑&#xff0c;我给大家讲一下哪些是C盘里的无用文件&#xff0c;并且删除后不会影响系统使用C盘是指电…

软件测试度量计算方法有哪些,软件测试度量(三)

进度差异趋势6.4.3 范围变化(SC)这个指标指出如何固定测试范围。下面总范围 以前的范围 新范围&#xff0c;如果范围扩大的话总范围 以前的范围 - 新范围&#xff0c;如果范围缩小的话一个发布版本范围变化趋势7、结论度量是评估的重要组成部分以及任何业务改进的基础。是应…

使用带有OAuth的Spring Security保护资源

1.简介 在本教程中&#xff0c;我们将研究如何使用Spring Security和OAuth来基于路径模式&#xff08; / api / ** &#xff09;保护服务器上的管理资源。 我们配置的另一个路径模式&#xff08; / oauth / token &#xff09;将帮助已配置的授权服务器生成访问令牌。 请注意&a…

openjpa_OpenJPA:内存泄漏案例研究

openjpa本文将提供完整的根本原因分析详细信息以及解决影响Oracle Weblogic Server 10.0生产环境的Java堆内存泄漏&#xff08;Apache OpenJPA泄漏&#xff09;的方法。 这篇文章还将演示在管理javax.persistence.EntityManagerFactory生命周期时遵循Java Persistence API最佳实…

美国凯斯西储大学计算机硕士专业怎么样,在凯斯西储大学读硕士大约需要多少花费?...

凯斯西储大学是美国著名大学之一&#xff0c;始建于1826年&#xff0c;坐落于俄亥俄州的克里夫兰&#xff0c;是一所以独立研究闻名的世界顶级私立大学&#xff0c;美国一级国家级大学。美国作为当今世界留学费用最高的国家之一&#xff0c;费用问题是所有赴美留学的学生都非常…

win7如何修改dns服务器地址,Win7系统DNS怎么设置?Win7系统DNS设置方法

Win7系统DNS怎么设置?众所周知&#xff0c;DNS地址是一个域名服务器地址&#xff0c;它可以把用户的网站地址解析成IP地址。如果这个服务器出现问题&#xff0c;可能就上不了网了。我们在使用Win7系统的时候&#xff0c;就是因为域名解析服务器不能将要访问的域名解析为正确的…

密钥文件登录服务器,密钥文件登录云服务器

密钥文件登录云服务器 内容精选换一换远程桌面协议(Remote Desktop Protocol&#xff0c;RDP)&#xff0c;是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器。从管理控制台下载的RDP文件对应唯一的云服务器&#xff0c;当前RDP文件命…