嵌套foreach的番石榴迭代器

时间:2016-07-07 16:58:23

标签: java java-8 guava

我想使用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;

我已经尝试但无法返回值。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

夫妻俩:

  1. 在接近"重构"就像那个问你,我真的强烈建议学习更多"纯粹" Java(我假设是这里的情况,@ javalearner)。例如,您可以使用long文字而不是手动装箱值:

    long x = 0L;
    long y = 0L;
    

    总之...

  2. 使用Guava在这里没有帮助 - 这是 这样做的必要方式,而使用Java 7 + Guava,你必须编写尴尬的匿名类(即{{ 1}} s),没有语言支持是痛苦的。这让我想到......
  3. Java 8和Streams。这可能是最好的方法,但首先你必须修复(?)你的代码并定义实际问题 - 例如,这个语句Function每次都会评估x= x + getSomeValue(x);并且不会x考虑到FirstLevely也是如此,所以我假设你的真正含义是SecondLevel
  4. 尽管如此 - 请更具体地说明您的问题是什么。

    修改

    在您澄清之后,使用流您的代码可能如下所示:

    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 + …的作用相同,但避免重复目标操作数。

假设LevelsgetSecondLevels的结果都是集合,您可以将其写为与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())