有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于嵌套foreach的java Guava迭代器

我想使用guava迭代器或java8 foreach(可能是lambda表达式)嵌套for循环,处理一些语句并返回一个长变量。这是我用本机java编写的代码。请原谅我的代码可能没有效率。我在网上读到,在新的Java8foreach中访问非最终变量是不可能的

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;

我尝试过,但无法返回值。提前感谢您的帮助


共 (1) 个答案

  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的结果都是集合,您可以编写与流操作相同的集合

    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是一个数组,则必须用Arrays.stream(Levels)替换Levels.stream(),同样,如果getSecondLevels()返回一个数组,则必须用Arrays.stream(first.getSecondLevels())替换first.getSecondLevels().stream()