Java Lambda流和Groovy Clouse的比较

这篇博客文章将探讨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

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

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

相关文章

【渝粤题库】广东开放大学 跨境电商实务之搜索引擎 形成性考核

选择题 题目&#xff1a; I.匹配题:将下列缩略语与全称进行匹配。&#xff08;每题1分&#xff0c;共15分&#xff09; 2) WTO A. Value added tax B. Shipping order C. Cable transfer D. Free on Board E. Central Business District F. World Trade Organization …

Matlab RGB 颜色对照表(0-1之间取值)

https://blog.csdn.net/qq_38882446/article/details/100886087

【渝粤题库】陕西师范大学111119 统计学作业

《统计学》作业 一、单项选择题 1、“统计”一词的三种含义是&#xff08; &#xff09;。 A. 统计调查、统计整理、统计分析 B. 统计工作、统计资料、统计学 C. 统计信息、统计咨询、统计监督 D. 统计理论、统计方法、统计技能 2、社会统计的研究对象是&#xff08; &#xff…

MATLAB下数组随机打乱顺序的方法

一&#xff1a;问题 有两个规模相同的数组&#xff0c;两个数组相同位置的元素一一对应&#xff0c;现在要将两数组的元素同时打乱顺序&#xff0c;并且乱序后的两数组对应位置元素要保持乱序前的对应关系。 二&#xff1a;方法 采用randperm&#xff08;&#xff09;函数&a…

【渝粤题库】陕西师范大学152102 管理学原理作业(高起专)

《管理学原理》作业 一、选择题 概念技能对&#xff08; &#xff09;最为重要。 A. 高层管理者 B. 中层管理者 C. 基层管理者 D. 非管理雇员 2.管理者决定什么任务将被完成&#xff0c;谁来完成这些任务&#xff0c;这些任务将如何组合&#xff0c;以及将在哪里做出决策是&am…

空间点过程(Point Processes)和随机测度(Random Measure)

1 空间点过程与随机测度&#xff08;一&#xff09;&#xff1a;从数星星说起 1.1 数星星的数学 小时候&#xff0c;在晴朗的夜里&#xff0c;我喜欢仰望星空&#xff0c;去数天上的星星——那是无忧无虑的快乐童年。长大后&#xff0c;当我们再度仰望苍穹&#xff0c;也许会思…

【渝粤题库】陕西师范大学163204 旅游规划学

一、单选题 1.具有美学、历史、科学价值的山、河、湖、海、动植物等自然景物和园林建筑、文物、古迹、革命地等 人文景观所构成的空间环境属于旅游地域系统中的&#xff08;  &#xff09;。 A景区 B名胜区 C风景名胜区 D风景区 2.创意构想作为影响旅游项目设计的一个主因子&…

【渝粤题库】陕西师范大学164212 国际贸易实务 作业(专升本)

《国际贸易实务》作业 名词解释 1. 凭样品买卖 2. 净价 3. 法定检验 4. 询价 5. 良好平均品质 6. 船舶受载期 7. 背书 8. 发价 9. 溢短装条款 10. 滞期费 11. 领事发票 12. 接受 13. 指示性标志 14. 预借提单 15. 付款交单 16. 还价 17. 贸易术语 18. 救助费用 19. 通知银行 20…

【渝粤题库】陕西师范大学180109 小学教师专业发展 作业

《小学教师专业发展》作业 一、单项选择题 1.职业是人获取社会资源与&#xff08; &#xff09;的媒介。 A. 自我发展 B. 自我成长 C. 自我成熟 D.自我实现 2.具备一定专业知识是教师胜任教师工作的基本条件&#xff0c;而非&#xff08; &#xff09;&#xff1b;一定的专业知…

add a legend to a boxplot in MATLAB

1. 给同组数据分类加legend figure; colors [1 0 0; 1 0 0; 0 0 1; 0 0.5 0; 0 0.5 0; 0 0.5 0]; x boxplot(rand(100,6),Colors,colors); legend(Group A,Group B,Group C)2.给不同组数据加legend box_vars findall(gca,Tag,Box); hLegend legend(box_vars([8,6]), {N…

oppo人岗匹配测评_在测试中使用匹配器

oppo人岗匹配测评我们被迫在测试代码中写太多断言行的日子已经一去不复返了。 镇上有一个新的警长&#xff1a;assertThat和他的代理人&#xff1a;匹配者。 好吧&#xff0c;这不是什么新东西&#xff0c;但是无论如何&#xff0c;我想向您介绍匹配器的使用方式&#xff0c;然…

【渝粤题库】陕西师范大学200041 文学概论 作业

《文学概论》作业 一、名词解释 1.文艺学 2.狭义文学 3.推陈出新 4.创作动机 5.文学本体论 6&#xff0e;艺术发现 7&#xff0e;艺术形式 8&#xff0e;现实型文学 9&#xff0e;典型 10&#xff0e;本文时间与故事时间 11&#xff0e;陌生化 12&#xff0e;剧本 13&#xf…

LaTeX indicator function

问题说明&#xff1a; \mathbb字符的空心化显示仅对字符有效&#xff0c;对数字无效。 解决方法&#xff1a; 1.使用 bbm 包 \documentclass{article} \usepackage{bbm} \begin{document}\[ \mathbbm{1} \]\end{document}2.使用 dsfont&#xff08;double stroke&#xff0…

【渝粤题库】陕西师范大学200471 英汉翻译

《英汉翻译》作业 I. Please translate the following phrases and the underlined part in each sentence. 1.break the record 2.armed to the teeth 3.sour grapes 4.a gentleman’s agreement 5.open door policy 6.the cold war 7.soft voice 8.soft fire 9. The poor acc…

JavaFX技巧31:遮罩/剪切/ Alpha通道

选择条 最近&#xff0c;我不得不实现一个自定义控件&#xff0c;该控件使用户可以从项目列表中选择一个项目。 此“ SelectionStrip”控件必须水平放置项目&#xff0c;并且在项目过多的情况下&#xff0c;允许用户左右水平滚动。 该控件将在空间受限的区域中使用&#xff0c;…

【渝粤题库】陕西师范大学200831 编译原理 作业

一、填空 1、预测分析方法LL&#xff08;1&#xff09;方法&#xff0c;它由一个栈&#xff0c;一个 和一个 组成。其中构造 是该分析方法的关键。 2、下面图 是一个DFA&#xff0c;而图 是一个NFA 3、词法分析器的任务是对 进行扫描&#xff0c;以 为依据识别出一个个单词符号…

通信中的频谱效率与能量效率

频谱效率(Spectral Efficiency) 频谱效率&#xff08;Spectral Efficiency&#xff0c;SE&#xff09;简称谱效&#xff0c;也称系统容量、频带利用率。 该指标用来衡量系统的有效性&#xff0c;描述了能够提供多少容量。 它定义为系统传输的有效信息速率R除以通信信道带宽B&a…

【渝粤题库】陕西师范大学201491 法学导论作业

《法学导论》作业 一、单项选择题 1&#xff0e;西方法学发展史上&#xff0c;著名法学家著作即学理法开始成为法律制度重要组成部分的是( ) A 古希腊 B古罗马 C近代 D现代 2&#xff0e;17-18世纪出现的资产阶级法权世界观的典型代表是( ) A 自然法学派 B历史法学派 C…

【渝粤题库】陕西师范大学201951 明清小说史 作业

单选题 1&#xff0e;将朝代兴替&#xff0c;争霸天下的题材组织成的长篇章回小说称作&#xff08; &#xff09; A、说铁骑 B、英雄传奇 C、历史演义 D、世情小说 2&#xff0e;以下见于《水浒传》的故事有&#xff08; &#xff09; A、智取生辰纲 B、火烧博望坡 C、弄权铁槛…

积分公式大全

https://kexue.fm/sci/integral/ 《积分公式大全》网络版本——By BoJone 引用原作者的话&#xff1a; 本附件所有公式来自《高等数学第三版》。   该书信息&#xff1a;同济大学数学教研室编&#xff0c;高等教育出版社&#xff0c;1988年4月第三版&#xff0c;ISBN 7-04-0…