我使用java8流来迭代两个列表,其中一个列表包含一些自定义对象,另一个包含字符串。
有了这个,我必须通过传递自定义对象和sting作为输入来调用方法,然后我必须得到计数。
这就是我的尝试:
public int returnCode() {
/*int count = 0;
* list.forEach(x -> {
list2.forEach(p -> {
count+ = myDao.begin(conn, x.getCode(), p);
});
return count;
});*/
}
编译器给出一个错误,计数应该是最终的。
任何人都可以,以更好的方式告诉我如何做到这一点。
答案 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();