lambdas for
Java 8具有lambda ,它类似于Groovy已有一段时间的构造: 闭包 。
在Groovy中,我们已经可以这样做:
def list = ['a', 'b', 'c']
print list.collect { it.toUpperCase() }
// [A, B, C]
其中{ it.toUpperCase() }
是闭包。
在Java 8中,我们现在可以以简洁的方式实现相同的功能。
list.stream().map( s -> s.toUpperCase() )
尽管您可能会争辩说,通过正确使用新的Stream API,批量操作和方法引用,现在至少可以清楚地传达一段代码的意图 -Java的冗长性仍然会引起眼睛不适 。
这是其他一些例子。
一些时髦的动物
class Animal {
String name
BigDecimal price
String farmer
String toString() { name }
}
def animals = []
animals << new Animal(name: "Buttercup", price: 2, farmer: "john")
animals << new Animal(name: "Carmella", price: 5, farmer: "dick")
animals << new Animal(name: "Cinnamon", price: 2, farmer: "dick")
示例1:汇总所有动物的总价
Groovy
assert 9 == animals.sum { it.price }
// or animals.price.sum()
您在这里看到什么Groovy:
-
sum
可以在List上调用,还可以选择传递一个闭包,以定义“ it”(被迭代的动物)的属性进行排序。 - 或
sum
可以在不带任何参数的List上调用,这等效于对集合中的所有项目调用“ plus ”方法。
Java 8
Optional<BigDecimal> sum =
animals.
stream().
map(Animal::getPrice).
reduce((l, r) -> l.add(r));
assert BigDecimal.valueOf(9) == sum.get();
您在这里看到的是什么Java:
- 通过Stream API的
stream
方法,我们可以创建一系列操作,例如map
和reduce
-
map
操作的参数是对当前迭代动物的getPrice()
方法的方法引用 。 我们也可以用表达式a -> a.getPrice()
替换此部分。 -
reduce
是一般的减少操作(也称为fold ),其中将价格的BigDecimals
相加。 这也为我们提供了一个Optional
的总金额。 - 顺便说一句,如果我们要使用双精度价格( 不是因为我想举一个很好的例子,那么我们就不会这样做) ,我们可以使用现有的带有Double
sum()
DoubleStream ,例如double sum = animals.stream().mapToDouble(Animal::getPrice).sum();
示例2:按农夫分组所有动物
Groovy
def animalsByFarmer = animals.groupBy { it.farmer }
// [john:[Buttercup], dick:[Carmella, Cinnamon]]
Java 8
Map<String, List<Animal>> animalsByFarmer =
animals
.stream()
.collect(
Collectors.groupingBy(Animal::getFarmer));
// {dick=[Carmella, Cinnamon], john=[Buttercup]}
例3:汇总按农民分组的所有动物的总价
Groovy
def totalPriceByFarmer =
animals
.groupBy { it.farmer }
.collectEntries { k, v -> [k, v.price.sum()] }
// [john:2, dick:7]
您在这里看到什么Groovy:
-
collectEntries
遍历“ groupBy”映射,使用k, v -> ...
闭包转换每个映射条目k, v -> ...
并返回转换后的条目的映射。v.price
实际上是一个价格列表(每个农民)(例如示例1),我们可以在其上调用sum()
。
Java 8
Map<String, BigDecimal> totalPriceByFarmer =
animals
.stream()
.collect(
Collectors.groupingBy(
Animal::getFarmer,
Collectors.reducing(
BigDecimal.ZERO,
Animal::getPrice,
BigDecimal::add)));
// {dick=7, john=2}
此Java代码再次产生相同的结果。 由于至少是Eclipse,IDE的格式不正确,因此您必须自己缩进这些类型的结构,以提高可读性。
翻译自: https://www.javacodegeeks.com/2014/06/java-8-lambdas-vs-groovy-closures-compactness-grouping-and-summing.html
lambdas for
最后
以上就是健忘短靴最近收集整理的关于lambdas for_Java 8 Lambdas与Groovy闭包紧凑性:分组和求和的全部内容,更多相关lambdas内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复