Java 8 lambda表达式:对每个List / Set和Iterable

时间:2017-11-03 10:25:52

标签: java lambda java-8

例如,我有一个列表(或集合),每个条目都要使用相同的方法。使用lamba可以轻松实现这一点:

ingredientBaskets.forEach(this::processToMarmalade);

但是我希望processToMarmalade方法能够返回无法处理的水果块数量,最后总结一下。通过总结方法并返回错误数量,我可以轻松地做到这一点。

我想拥有的基本上是这样的:

int result = ingredientBaskets.forEach(this::processToMarmalade).sum();
某事。 或者换句话说,就像这样做:

int result = 0;
for (final Basket basket: ingredientBaskets) {
     result += processToMarmalade(basket)
}
}

有办法吗?

编辑:从答案中,List和Set将允许使用IntStream,这是我需要的一件事。然而,如果它是可以进行的呢?这个没有流,只有一个forEach 假设原始问题,也适用于Iterable的情况。 forEach可以总结一下,还是我必须先创建一个新的List并用Iterable的内容填充它?

3 个答案:

答案 0 :(得分:4)

您要找的是the mapToInt method(假设processToMarmalade返回int):

int result = ingredientBaskets.stream().mapToInt(this::processToMarmalade).sum();

如果您的ingredientBasketsIterable<?>,则convert it to a stream可以这样:

StreamSupport.stream(ingredientBaskets.spliterator(), false)
             .mapToInt(this::processToMarmalade)
             .sum();

答案 1 :(得分:1)

ingredientBaskets.stream()
    .mapToInt(this::processToMarmalade)
    .sum()

答案 2 :(得分:0)

我想我会这样做:

ingredientBaskets.stream().mapToInt(this::processToMarmalade).sum();