groovy lambda_Java Lambda流和Groovy Clouse的比较

groovy lambda

这篇博客文章将研究List数据结构上的一些谚语操作,并对Java 8/9和Groovy语法进行一些比较。

因此,首先是数据结构。 这只是一个简单的橄榄球球员,具有名字和等级。

Java

class RugbyPlayer {private String name;private Integer rating;RugbyPlayer(String name, Integer rating) {this.name = name;this.rating = rating;}public String toString() {return name + "," + rating;}public String getName() {return name;}public Integer getRating() {return rating;}
}//...
//...
List<RugbyPlayer> players = Arrays.asList(new RugbyPlayer("Tadgh Furlong", 9),new RugbyPlayer("Bundee AKi", 7),new RugbyPlayer("Rory Best", 8),new RugbyPlayer("Jacob StockDale", 8)
);

Groovy

@ToString
class RugbyPlayer {String nameInteger rating
}
//...
//...
List<RugbyPlayer> players = [new RugbyPlayer(name: "Tadgh Furlong", rating: 9),new RugbyPlayer(name: "Bundee AKi", rating: 7),new RugbyPlayer(name: "Rory Best", rating: 8),new RugbyPlayer(name: "Jacob StockDale", rating: 8)
]

查找特定记录

Java

// Find Tadgh Furlong
Optional<RugbyPlayer> result = players.stream().filter(player -> player.getName().indexOf("Tadgh")  >= 0).findFirst();      
String outputMessage = result.isPresent() ? result.get().toString() : "not found";
System.out.println(outputMessage);

Groovy

println players.find{it.name.indexOf("Tadgh") >= 0}

注释

  • Java lambda中只有一个参数– player。 由于可以推断其类型,因此无需键入。 注意:此lambda仅使用一个参数。 如果参数列表中有两个参数,则需要在参数列表中加上括号。
  • 在Java中,必须首先从List创建流。 然后,在执行返回Optional的函数之前,先使用lambda
  • lambda定义不需要return语句。 它也不需要{}大括号或那些分号来完成Java语句。 但是,如果需要,可以使用{},如果需要,则必须包含;。 和return语句。 注意:如果lambda超过一行,则无法选择,必须使用{}。 建议最佳实践,以使Lambda短而仅占一行。
  • Java 8支持流水线操作的流利API。 Groovy收集操作也支持此功能。
  • 在Java中,为Lambda指定了播放器变量。 Groovy闭包不需要指定变量。 它只能使用“ it”,它是对参数的隐式引用(类似于Scala中的_)。
  • Java过滤器API接受Predicate类型的参数。 功能接口是指: 可用作lambda表达式或方法引用的分配目标。 谓词是功能接口的类型。 它的一种抽象方法是:布尔测试(T t)。 在这种情况下,在lamda中,玩家对应于t。 主体定义应为true或false,在我们的例子中player.getName()。indexOf(“ Tadgh”)始终为true或false。 真对应于一场比赛。
  • Java 8还具有其他类型的功能接口:
    • 函数 –它接受一个参数并返回结果
  • Java 8可以推断lambda输入参数的类型。 请注意,如果必须指定参数类型,则声明必须放在方括号中,以进一步增加详细程度。
  • Groovy可以直接println。 不需要System.out,也不需要后续的花括号。
  • 像Java一样,Groovy不需要return语句。 但是,这不仅适用于闭包,在Groovy中,它还扩展到了每种方法。 评估为最后一行的任何内容都会自动返回。
  • Groovy没有功能接口的概念。 这意味着如果您忘记确保最后一个表达式是合适的布尔表达式,则会在运行时得到意外的结果和错误。
  • Groovy和Java中都使用了箭头运算符来有效地表示同一件事–将参数列表与主体定义分开。 在Groovy中,只需要声明参数即可(默认情况下不足够)。 注意:在Scala中,使用=>。

查找特定记录

Java

// Find all players with a rating over 8
List<RugbyPlayer> ratedPlayers = players.stream().filter(player -> player.getRating() >= 8).collect(Collectors.toList());
ratedPlayers.forEach(System.out::println);

Groovy

println players.findAll{it.rating >= 8}

注释

  • 在Java版本中,Iterable ObjectratedPlayers调用了其forEach方法。 此方法采用类型为Consumer的FunctionalInterface(请参阅Jdoc, 在此处 )。 消费者,使用接收输入参数但不返回任何参数的函数,该函数无效。
  • System.out :: println是方法参考– Java 8中的新功能。它是语法糖,可以减少某些lambda的冗长性。 这实际上是说,对于ratedPlayers中的每个元素,都执行System.out.println,并将当前元素作为参数传入。
  • 再次减少了Groovy的语法。 该函数可以对集合进行操作,无需创建Stream。
  • 其实我们可以只打印了Java样本在整个名单,但赫克我想演示的forEach和方法参考。

从对象类型映射到另一个

Java

// Map the Rugby players to just names. 
// Note, the way we convert the list to a stream and then back again to a to a list using the collect API. 
System.out.println("Names only...");
List<String> playerNames = players.stream().map(player -> player.getName()).collect(Collectors.toList());
playerNames.forEach(System.out::println);

Groovy

println players.collect{it.name}

注释

  • 在执行Lambda之前,首先需要创建一个流。 然后在Stream上调用collect()方法,这是将其转换回List所必需的。 这使代码更加冗长。

执行减少量计算

Java

System.out.println("Max player rating only...");
Optional<Integer> maxRatingOptional = players.stream().map(RugbyPlayer::getRating).reduce(Integer::max);
String maxRating = maxRatingOptional.isPresent() ? maxRatingOptional.get().toString() : "No max";
System.out.println("Max rating=" + maxRating);

Groovy

def here = players.inject(null){ max, it -> it.rating > max?.rating ? it : max
}

注释

  1. 在Groovy注入闭包中使用了null安全运算符-以便进行第一次比较

摘要

  1. Groovy仍然更简洁
  2. 但是,Java中的某些操作是延迟运行的。 例如map(),filter()被认为是中间的。 除非在流上调用终端函数,例如forEach,collect,reduce,否则它们将不会执行。 在某些情况下,这可能会使代码更冗长,但也意味着它可以提高性能。
  3. Groovy还提供了一些惰性函数。

完整的Java代码在这里 。 完整的Groovy代码在这里 。

翻译自: https://www.javacodegeeks.com/2018/07/java-lambda-streams-and-groovy-clouses-comparisons.html

groovy lambda

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

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

相关文章

Maven定制化打包后的包名(加入时间戳)

在对应的pom文件中加入配置 设置时间戳格式 <properties> <maven.build.timestamp.format>yyyy-MM-dd_HH_mm</maven.build.timestamp.format> </properties> 定制包名字 <build> <finalName>${project.artifactId}-${project.versio…

MacOS/MacBook设置短语快捷键

打开电脑的系统偏好设置 → 键盘 → 文本&#xff0c;如下图所示&#xff1a;

mhd格式三维图像显示_给你的家乡做个三维地图模型,满满的成就感,快来学习下...

以上三维地图模型&#xff0c;利用卫星影像高程数据&#xff0c;实现地图立体三维效果&#xff0c;自己就可以在电脑上个3D沙盘&#xff0c;是不是很酷呢&#xff1f;想要制作三维地图模型必须两样素材&#xff0c;第一是卫星影像&#xff0c;第二是高程数据&#xff0c;之前的…

纹理和基元_Java的精妙之处,包括基元和变量参数数组

纹理和基元在我最近的博客文章Arrays.hashCode&#xff08;&#xff09;与 DZone联合版本的评论中提出了一个有趣的问题。 Objects.hash&#xff08;&#xff09; “。 该评论的作者建立了一些示例&#xff0c;这些示例与我的博客文章中使用的示例相似&#xff0c;并且显示出与…

ORACLE数据库常用命令总结

SELECT * FROM all_tables WHERE ownericore_prdtdb; --查询当前用户下所有的表名 SELECT table_name FROM user_tables; --查询当前用户下所有的表 SELECT * FROM user_tables; --查询当前用户下所有的索引 SELECT * FROM USER_indexes; --查询当前用户下所有的序列 SEL…

MacOS使用brew无法安装Python_无法安装gdbm_无法安装autojump

文章目录出现的问题解决无法安装gbdm的问题解决无法安装Python的问题GNU 程序国内下载源&#xff1a;https://mirrors.ustc.edu.cn/gnu/ brew 下载的软件安装包存放在下面的目录&#xff1a; liaowenxiongdeMacBook-Air:Homebrew liaowenxiong$ brew --cache /Users/liaowenx…

客户说发货慢怎么回复_?沐言恋爱学:当女生说“我累了”,怎么回复最合适?...

沐言恋爱学&#xff1a;当女生说“我累了”&#xff0c;怎么回复最合适&#xff1f;学员提问&#xff1a;沐言解答&#xff1a;01兄弟你在考虑该怎么回复她之前你需要做的不仅仅是直接读懂她的字面意思而是需要了解事情背景比如&#xff1a;时间她经历的事情是不是身体不太舒服…

react 线程_React式服务中的线程本地状态可用性

react 线程任何架构决策都需要权衡。 如果您决定采用React式&#xff0c;也没有什么不同&#xff0c;例如&#xff0c;一方面使用React式流实现几乎可以立即获得更好的资源利用率&#xff0c;但另一方面会使调试更加困难。 引入React式库也对您的域产生巨大影响&#xff0c;您的…

iTerm2的使用技巧及快捷键

文章目录查看剪贴板内容清屏切换全屏切屏/分屏切换标签栏移动标签栏编辑会话打开最近的目录复制粘贴查找移动光标搜索历史命令查看历史命令删除滚屏界面窗口缩放搜索会话/配置文件/快照展开&#xff08;Expose&#xff09;所有的标签窗口操作查看当前终端中光标的位置开启和关闭…

位运算和进制转换,反码补码

进制转换 package junit;public class Test {public static void main(String[] args) { // int aInteger.MIN_VALUE;int bInteger.MAX_VALUE;int cInteger.MIN_VALUE;System.out.println(b);System.out.println(c);print(b);// 最高位表示 符号位 最高位0 表示正数 …

python绘制pr曲线图_如何利用Python制作可以动的动态图表。

来源&#xff1a;机器之心原文链接&#xff1a;https://towardsdatascience.com/learn-how-to-create-animated-graphs-in-python-fce780421afe在读技术博客的过程中&#xff0c;我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的&#xff1f;难…

switch字符串jdk_JDK 12 Early Access Build 12中的原始字符串文字支持

switch字符串jdk本周Java世界上最大的新闻可能是JDK 11的通用性。 但是&#xff0c;另一个令人兴奋的发展是JDK 12 Early Access Build 12的发布 &#xff08; 2018年9月20日 &#xff09;。 JDK 12的这个早期访问生成12是显著&#xff0c;因为它包括与实施方式中JEP 326 [“原…

MacOS安装pip失败,提示:SyntaxError: invalid syntax

使用命令 easy_install 安装 pip 使用命令 sudo easy_install pip 安装 pip&#xff0c;结果失败了&#xff0c;执行命令的信息如下&#xff1a; ➜ ~ sudo easy_install pip Password: Searching for pip Reading https://pypi.org/simple/pip/ Downloading https://files.…

java压缩视频

引入依赖 <dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>3.0.0</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-all-dep…

经济学自身利益最大化_劳动经济学:研究劳动力市场运作的专业

多年以来同学们对劳动经济学认知上存在误区&#xff0c;很多同学一上来看到劳动两字会误以为这是让自己去当工人干活。事实并非如此&#xff0c;例如人力资源管理&#xff0c;大家都知道是一门很热门、实用的管理学&#xff0c;毕业后可以从事hr的工作&#xff0c;其实劳动经济…

corda_使用Spring WebFlux从Corda节点流式传输数据

corda自上次发布以来已经有一段时间了&#xff0c;但我终于回来了&#xff01; 由于我仍在我的项目中&#xff0c;因此我将再次撰写有关使用Corda的文章。 这次&#xff0c;我们将不再关注Corda&#xff0c;而是将Spring与Corda结合使用。 更具体地说&#xff0c;Spring WebFlu…

iTerm2 隐藏用户名和主机名

有时候我们的用户名和主机名太长&#xff0c;比如我的&#xff1a; 这么长的提示符前缀&#xff0c;在终端显示的时候会很不好看&#xff0c;我们可以手动去除。 编辑 ~/.zshrc 文件&#xff0c;增加 DEFAULT_USER"lwx" 配置&#xff0c;如下所示&#xff1a; 注…

投影串口测试程序_串口测试方法和步骤

信号测试与分析版号&#xff1a;xxx编写&#xff1a;xxx1、232串口信号&#xff1a;要点&#xff1a;RS232采用三线制传输分别为TXD\RXD\GND其中TXD为发送信号&#xff0c;RXD为接收信号。全双工&#xff0c;在RS232中任何一条信号线的电压均为负逻辑关系。即&#xff1a;—15v…

springBoot中自定义的yml文件引用的方式

一、yml配置文件 在yam文件中配置自定义的标签 1.在yml配置文件中加入 through:url: http://10.4.2.140:49003/IBSThrough2.测试类进行测试 import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; /…

MacOS安装zsh插件zsh-autosuggestion(自动命令补全和建议)

文章目录安装命令一安装命令二安装命令三使用插件 zsh-autosuggestion 用于命令建议和补全。 GitHub主页&#xff1a;https://github.com/zsh-users/zsh-autosuggestions 安装命令一 cd ~/.oh-my-zsh/custom/plugins/ git clone https://github.com/zsh-users/zsh-autosugg…