我是靠谱客的博主 健忘短靴,这篇文章主要介绍lambdas for_Java 8 Lambdas与Groovy闭包紧凑性:分组和求和,现在分享给大家,希望可以做个参考。

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方法,我们可以创建一系列操作,例如mapreduce
  • 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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部