推广 高端网站建设,汕头房地产网,网站变量,北京网页制作方案groovy lambda这篇博客文章将研究List数据结构上的一些谚语操作#xff0c;并对Java 8/9和Groovy语法进行一些比较。 因此#xff0c;首先是数据结构。 这只是一个简单的橄榄球球员#xff0c;具有名字和等级。 Java class RugbyPlayer {private String name;private Inte… 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;}
}//...
//...
ListRugbyPlayer 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
}
//...
//...
ListRugbyPlayer 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
OptionalRugbyPlayer 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
ListRugbyPlayer 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...);
ListString 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...);
OptionalInteger 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
}注释 在Groovy注入闭包中使用了null安全运算符-以便进行第一次比较 摘要 Groovy仍然更简洁 但是Java中的某些操作是延迟运行的。 例如mapfilter被认为是中间的。 除非在流上调用终端函数例如forEachcollectreduce否则它们将不会执行。 在某些情况下这可能会使代码更冗长但也意味着它可以提高性能。 Groovy还提供了一些惰性函数。 完整的Java代码在这里 。 完整的Groovy代码在这里 。 翻译自: https://www.javacodegeeks.com/2018/07/java-lambda-streams-and-groovy-clouses-comparisons.htmlgroovy lambda