我想使用guava迭代器或java8 foreach(可能是lambda表达式)嵌套for循环并处理一些语句并返回一个long变量。这是我在本机java中的代码。请原谅我的代码可能效率不高。我读过net访问新java 8中的非最终变量foreach是不可能的。
Long x = Long.valueOf(0);
Long y = Long.valueOf(0);
for(FirstLevel first : Levels)
{
if(first.getSecondLevels() == null)
{
x= x + getSomeValue(first);
}
for (SecondLevel second : first.getSecondLevels())
{
y = y + getSomeValue(second);
}
}
return x + y;
我已经尝试但无法返回值。在此先感谢您的帮助!
答案 0 :(得分:3)
夫妻俩:
在接近"重构"就像那个问你,我真的强烈建议学习更多"纯粹" Java(我假设是这里的情况,@ javalearner)。例如,您可以使用long
文字而不是手动装箱值:
long x = 0L;
long y = 0L;
总之...
Function
每次都会评估x= x + getSomeValue(x);
并且不会x
考虑到FirstLevel
和y
也是如此,所以我假设你的真正含义是SecondLevel
。尽管如此 - 请更具体地说明您的问题是什么。
修改强>
在您澄清之后,使用流您的代码可能如下所示:
x =+ getSomeValue(firstLevel);
或使用一些辅助方法:
final long sum = levels.stream()
.mapToLong(first -> getSomeValue(first) + first.getSecondLevels().stream().mapToLong(this::getSomeValue).sum())
.sum();
答案 1 :(得分:1)
首先,使用盒装Long
值是没有意义的,即使你曾经需要一个盒装值,你也不需要调用Long.valueOf
,Java已经为你做了将long
原语转换为装箱Long
对象。
此外,由于添加long
值并不取决于加数的顺序,因此没有理由在整个操作中保持两个变量,无论如何你最后都会添加它们:
long result=0;
for(FirstLevel first: Levels) {
result += getSomeValue(first);
for(SecondLevel second: first.getSecondLevels()) {
result += getSomeValue(second);
}
}
return result;
请注意,运算符+=
与此处result = result + …
的作用相同,但避免重复目标操作数。
假设Levels
和getSecondLevels
的结果都是集合,您可以将其写为与Stream操作相同的
return Levels.stream()
.mapToLong(first ->
getSomeValue(first) + first.getSecondLevels().stream()
.mapToLong(second -> getSomeValue(second)).sum())
.sum();
或者
return Levels.stream()
.flatMapToLong(first -> LongStream.concat(
LongStream.of(getSomeValue(first)),
first.getSecondLevels().stream().mapToLong(second -> getSomeValue(second))))
.sum();
如果Levels
是数组,则必须将Levels.stream()
替换为Arrays.stream(Levels)
,同样,如果getSecondLevels()
返回数组,则必须替换first.getSecondLevels().stream()
与Arrays.stream(first.getSecondLevels())