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

Java Lambda流和Groovy Clouse的比较相关推荐

  1. groovy lambda_Java Lambda流和Groovy Clouse的比较

    groovy lambda 这篇博客文章将研究List数据结构上的一些谚语操作,并对Java 8/9和Groovy语法进行一些比较. 因此,首先是数据结构. 这只是一个简单的橄榄球球员,具有名字和等级 ...

  2. java闭包lambda,闭包在groovy vs闭包在java 8(lambda表达式)?

    Given doSomething(Function foo) { println foo(2) } Groovy: doSomething( { it*it } as Function ) Java ...

  3. java lambda::_基准测试:Java 8 Lambda和流如何使您的代码慢5倍

    java lambda:: 与长期的实现相比,Java 8 lambda和流的性能如何? Lambda表达式和流在Java 8中受到了热烈的欢迎.这些是迄今为止很激动人心的功能,很长一段时间以来,它们 ...

  4. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

  5. Java Lambda表达式入门

    本文转自:http://blog.csdn.net/renfufei... 转载请注明出处 原文链接: Start Using Java Lambda Expressions 下载示例程序 Examp ...

  6. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

  7. java 用流创建流_成为Java流大师–第1部分:创建流

    java 用流创建流 在许多情况下,声明性代码(例如,具有Streams的功能组合)提供了出色的代码指标. 通过该动手实验文章系列进行编码,并成为Java Streams的主教练,从而成为一名更好的J ...

  8. java8流分组 性能_Java性能教程– Java 8流有多快?

    java8流分组 性能 在此JAX Magazine的预览预览中,JAX伦敦发言人Angelika Langer为使用Java流的任何人回答了最重要的问题:它们真的更快吗? Java 8是JDK收集框 ...

  9. java lambda::_书评:精通Lambda:多核世界中的Java编程

    java lambda:: 从版本8开始,λ编程(lambda编程)终于在Java世界中引入.此功能将在很大程度上改变Java开发人员的编程方式以及针对样板代码的新"武器". Ja ...

最新文章

  1. MySQL 代码结构与基本流程
  2. MFC控件的绘制与响应顺序——ZOrder
  3. shutter 无法设置快捷键的解决方法
  4. LeetCode28 对称的二叉树-简单
  5. Azure手把手系列 3:把IT的钱花在刀刃上
  6. nginx配置wordprocess访问wp-admin自动加斜杠配置实例
  7. 写一个方法判断一个整数是否为质数_请写一个函数来检查用户提交的数据是否为整数...
  8. C语言和设计模式(外观模式)
  9. Linux中的查找命令find、which、whereis
  10. 树莓派外设、模块、传感器 —— 数码管(F3461BH)
  11. msicuu2微软卸载工具
  12. 表示偏移地址的寄存器
  13. 学计算机拼音不好怎么办,孩子拼音基础差怎么办?告诉你学拼音技巧!
  14. 数据中心安全域的设计和划分
  15. android查看显存大小,Shadow Size Computation 阴影大小计算
  16. 【Qt】模型/视图结构和数据绑定控件
  17. ap接口 php_php中api接口什么用
  18. 他一个人干掉了5个装甲军
  19. linux mysql dengl_mysql中类似oracle的over分组实现
  20. vmospro启动黑屏_在Mac上从睡眠唤醒中修复黑屏 | MOS86

热门文章

  1. 【贪心】Stall Reservations(luogu 2859/poj 3190)
  2. codeforces gym-101755 I-Guess the Tree 交互题、分治、树的直径
  3. 2017西安交大ACM小学期数据结构 [树状数组,极大值]
  4. 2、oracle数据库的用户和权限
  5. MyBatis Generator分页插件RowBoundsPlugin坑
  6. 【深入理解JVM】:类加载器与双亲委派模型
  7. Ribbon 客户端负载均衡
  8. JS删除之前弹出一个带有确认和取消按钮的提示框confirm()
  9. oracle修改redolog路径,oracle修改redo log files路径
  10. java 内存快照怎么看_jvm内存快照dump文件太大,怎么分析