如何在流中使用嵌套的foreach循环时返回计数

时间:2018-06-15 02:44:03

标签: java-8 java-stream

我使用java8流来迭代两个列表,其中一个列表包含一些自定义对象,另一个包含字符串。

有了这个,我必须通过传递自定义对象和sting作为输入来调用方法,然后我必须得到计数。

这就是我的尝试:

public int returnCode()  {
        /*int count = 0;
         * list.forEach(x -> {
            list2.forEach(p -> {
                count+ = myDao.begin(conn, x.getCode(), p);
            });
            return count;
        });*/   
    }

编译器给出一个错误,计数应该是最终的。

任何人都可以,以更好的方式告诉我如何做到这一点。

2 个答案:

答案 0 :(得分:1)

Lambdas主要替代匿名内部类。在匿名内部类中,您只能访问最终的局部变量。因此,lambda表达式也是如此。当JVM创建lambda实例时,会复制局部变量,因此允许对它们进行任何更新是反直觉的。因此将变量声明为final可以解决问题。但如果你成功final,你就无法做到这一点,导致另一个陷阱。

count+ = myDao.begin(conn, x.getCode(), p);

所以你的解决方案不好,不符合lambda。所以这将是一种做法。

final int count = customObjects.stream()
    .mapToInt(co -> strings.stream().mapToInt(s -> myDao.begin(conn, co.getCode(), s)).sum())
    .sum();

答案 1 :(得分:1)

您尝试做的事情是不可能的,因为从lambda访问的局部变量必须是 final 有效最终,即任何值不会改变的变量。< / p>

您正在尝试更改传递给count的lambda中forEach的值,从而导致编译错误。

要使用流API复制您的确切代码,它将是:

int count = list.stream()
                .limit(1)
                .flatMapToInt(x -> list2.stream().mapToInt(p -> myDao.begin(conn, x.getCode(), p)))
                .sum();

但是,如果要迭代list中的整个序列而不是第一个序列,那么您可以继续执行以下操作:

int count = list.stream()
                .flatMapToInt(x -> list2.stream().mapToInt(p -> myDao.begin(conn, x.getCode(), p)))
                .sum();