当前位置: 首页 > 面试题库 >

使用流中的Java 8 foreach循环移至下一项

萧玮
2023-03-14
问题内容

我在Java 8
foreach流中尝试循环移动下一个项目时遇到问题。我无法将命令设置为continue;return;但只能工作,但是在这种情况下,您将退出循环。我需要继续循环下一个项目。我怎样才能做到这一点?

示例(不起作用):

try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
            filteredLines = lines.filter(...).foreach(line -> {
           ...
           if(...)
              continue; // this command doesn't working here
    });
}

示例(工作):

try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
    filteredLines = lines.filter(...).collect(Collectors.toList());
}

for(String filteredLine : filteredLines){
   ...
   if(...)
      continue; // it's working!
}

问题答案:

使用return;就可以了。这不会阻止完整循环的完成。它将仅停止执行forEach循环的当前迭代。

试试下面的小程序:

public static void main(String[] args) {
    ArrayList<String> stringList = new ArrayList<>();
    stringList.add("a");
    stringList.add("b");
    stringList.add("c");

    stringList.stream().forEach(str -> {
        if (str.equals("b")) return; // only skips this iteration.

        System.out.println(str);
    });
}

输出:

一个
ç

请注意,如何return;b迭代执行,但是c可以在后续迭代中打印出来。

为什么这样做?

一开始该行为看起来不直观的原因是因为我们习惯于return中断整个方法的执行的语句。因此,在这种情况下,我们希望整个main方法执行都将停止。

但是,需要理解的是lambda表达式,例如:

str -> {
    if (str.equals("b")) return;

    System.out.println(str);
}

……确实需要被认为是它自己独特的“方法
main,尽管它很方便地位于其中,但与方法完全分开。因此,实际上,该return语句仅停止执行lambda表达式。

需要理解的第二件事是:

stringList.stream().forEach()

…实际上只是一个普通的循环,它在每次迭代时都执行lambda表达式。

考虑到这两点,可以按照以下等效方式(仅用于教育目的)重写以上代码:

public static void main(String[] args) {
    ArrayList<String> stringList = new ArrayList<>();
    stringList.add("a");
    stringList.add("b");
    stringList.add("c");

    for(String s : stringList) {
        lambdaExpressionEquivalent(s);
    }
}

private static void lambdaExpressionEquivalent(String str) {
    if (str.equals("b")) {
        return;
    }

    System.out.println(str);
}

有了等效的“少魔术”代码,该return语句的范围就变得更加明显。



 类似资料:
  • 问题内容: 我正在尝试为特定站点构建代理刮板,但是无法进入下一页。 这是我正在使用的代码。 如果您回答了我的问题,请向我解释一下您所使用的内容,如果可以的话,请向我解释一下,如果有关于此类代码的好的教程,请给我一些: 问题答案: 要转到 下一页, 您可以尝试以下解决方案: 代码块: 控制台输出:

  • 我需要同时在两组div中上下循环。这段代码可以很好地循环列表(button1),但是当我试图创建一个向下按钮(button2)时,它会扰乱div顺序,并且不能正确地循环。我如何修改这段代码,使它成功地以正确的顺序在列表中上下循环? null null

  • 假设我们正在使用这个类: 现在我们有了一个学生名单,我们被问到了一些问题,比如: 筛选姓名为“Jonh”的人并得到平均年龄 过滤那些名字是“玛丽”的人并获得最大的高度 过滤那些名字是“ben”的人,得到最小的权重 我认为一个干净易懂的解决方案是使用lambdas按名称过滤并得到所要求的内容: 我想它至少要在列表上迭代3次,使用带有条件的单个循环可能更有效: 我认为第一种方法更干净,但第二种更快。我

  • 问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。

  • 我目前正在学习位操作,我的任务是做一个左旋转的4位整数。 我的4位左旋转代码是 我想做一个4位循环移位,以保持作为一个4位后旋转,但似乎不能理解它是如何工作的。 例如:10(1010)左旋转1位后给出5(0101),但它给出的值是21,比我的4位多。 任何能让我理解这个问题的帮助都将不胜感激!

  • 我正在迭代两个不同大小的列表: 我要做的是:遍历这两个列表并从array1中挑出所有元素,为此我可以在array2中找到一个元素,该元素与array1中的元素相加产生一定的和。 有没有人知道我怎么用流来处理这个案子?