我遇到了Java8foreach流try 移动循环中的下一项的问题.我不能将命令设置为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);
    });
}

输出:

A
C

注意b迭代的return;是如何执行的,但是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语句的范围变得更加明显.

Java相关问答推荐

使用hibiter中特定字段的where条款自定义映射

Gmail Javi API批量处理太多请求

Mat. n_Delete()和Mat. n_release的区别

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

如何才能使我的程序不会要求两次输入?

如何获得执行人?

Chunk(Int)已弃用并标记为要删除

暂停计时器

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

返回响应时,CamelCase命名约定不起作用

将响应转换为带值的键

支持MySQL 5.6的最新Hibernate版本

二进制数据的未知编码/序列化

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

IntelliJ IDEA依赖项工具窗口丢失

如何调整JButton的大小以适应图标?

为什么相同的数据条码在视觉上看起来不同?

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

通过/失败的参数化junit测试方法执行数