如何在Java 8流上使用foreach循环进行迭代

瓦济姆:

假设我们尝试将可能引发检查异常的lambda应用于Java 8流:

Stream<String> stream = Stream.of("1", "2", "3");
Writer writer = new FileWriter("example.txt");

stream.forEach(s -> writer.append(s)); // Unhandled exception: java.io.IOException

这不会编译。

一种解决方法是将检查后的异常嵌套在其中,RuntimeException但是这会使以后的异常处理变得复杂而且很丑陋:

stream.forEach(s -> {
    try {
        writer.append(s);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
});

另一种解决方法可能是转换限制功能forEach,以普通的旧的foreach 循环是比较友好的检查的异常。

但是幼稚的方法失败了:

for (String s : stream) { // for-each not applicable to expression type 'java.util.stream.Stream<java.lang.String>'
    writer.append(s);
}

for (String s : stream.iterator()) { // foreach not applicable to type 'java.util.Iterator<java.lang.String>'
    writer.append(s);
}

更新资料

为何在Stream <T>不实现Iterable <T>的地方贴了一个回答该问题的技巧作为副答案本身并不能真正回答该问题。我认为这不足以使这个问题与该问题重复,因为他们问的是不同的事情。

瓦济姆:

根据定义, foreach循环需要传入一个Iterable

可以使用匿名类实现:

    for (String s : new Iterable<String>() {
        @Override
        public Iterator<String> iterator() {
            return stream.iterator();
        }
    }) {
        writer.append(s);
    }

使用lambda可以简化此过程,因为它Iterable是一个功能接口

    for (String s : (Iterable<String>) () -> stream.iterator()) {
        writer.append(s);
    }

可以将其转换为方法参考

    for (String s : (Iterable<String>) stream::iterator) {
        writer.append(s);
    }

使用中间变量或方法参数可以避免显式强制转换:

    Iterable<String> iterable = stream::iterator;
    for (String s : iterable) {
        writer.append(s);
    }

Maven Central还有StreamEx库,它具有开箱即用的可迭代流和其他特权。


以下是一些最流行的问题和方法,它们提供了有关lambda和流中检查异常处理的解决方法:

抛出异常的Java 8 Lambda函数?

Java 8:Lambda-Streams,按方法进行异常过滤

如何从Java 8流中引发CHECKED异常?(不将其包装为未经检查的异常)

Java 8:lambda表达式中的强制检查异常处理。为什么是强制性的而不是可选性的?

jOOλ未选中

科特林 ;)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Java 8流迭代引用父元素的嵌套for循环?

如何在MyBatis foreach中通过HashMap进行迭代?

如何在Java中使用迭代器?

如何在Java中的bson文档中进行迭代

如何跳过“ foreach”循环的迭代?

如何在Java 8中一年中的每个星期进行迭代?

如何加载文件并使用Java 8进行迭代?

如何使用Java 8 Streams和Lambdas迭代引用父元素的嵌套for循环?

如何在Spark结构化流上的两个流之间建立联接?-Java 8

如何在PHP的foreach循环中重复特定的迭代?

如何在SSIS中使用“从变量枚举器进行Foreach”以编程方式创建foreach循环

在C#中,如何在嵌套的foreach循环中强制通过IEnumerable进行迭代?

如何在String对象上使用Java 8 forEach对值进行编码?

如何在AutoMapper中使用foreach循环

使用对象Java语言在foreach循环中进行最后一次迭代

如何在Java中对多维数组使用foreach或增强的for循环?

如何在foreach循环的每个迭代中更改后值

如何在for循环中使用不同的值进行迭代?

如何在foreach循环中迭代ViewBag名称?

如何在.NET Core Razor页面中使用foreach循环对表数据进行分组?

(java)如何为每个循环使用double [] [] 2d数组进行迭代?

我如何在Java中通过TwoDHashMap进行迭代?

如何在foreach循环中使用&&运算符来同时迭代2个集合

如何在PHP中控制foreach循环迭代

在Java 8中使用流在列表上进行迭代

如何在foreach中使用循环?

如何在foreach循环中的每次迭代后进行延迟?

如何在索引 40-60 之间迭代“foreach 循环”?

如何使用多个列表进行 foreach 循环