当前位置: 首页 > 知识库问答 >
问题:

如何在Java8流上使用foreach循环迭代

云胤
2023-03-14
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
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);
}

更新

回答这个问题的一个技巧以前在Why does stream not implementing iterable 上发布过?作为旁侧答案并不能真正回答问题本身。我认为这不足以将这个问题定性为那个问题的重复,因为他们问的是不同的问题。

共有1个答案

欧阳勇军
2023-03-14

根据定义,foreach循环需要传入一个迭代程序。

可以通过匿名类实现:

    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库,它提供了可迭代流和其他开箱即用的特性。

Java8:Lambda-Streams,通过有异常的方法筛选

如何从Java8流内部抛出检查异常?(不将其包装为未检查的异常)

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

 类似资料:
  • 问题内容: 假设我们尝试将可能引发检查异常的lambda应用于Java 8流: 这不会编译。 一种解决方法是将检查后的异常嵌套在其中,但是这会使以后的异常处理变得复杂,而且很丑陋: 另一种解决方法可能是转换限制功能,以普通的旧的foreach 循环是比较友好的检查的异常。 但是幼稚的方法失败了: 更新资料 为何在的地方贴了一个回答该问题的技巧。作为副答案本身并不能真正回答该问题。我认为这不足以使这

  • 如果我试图在java中查找遍历foreach循环的次数,还有比这更好的方法吗? 我知道我可以只使用一个普通的for循环并拥有一个迭代器I,但我只是想知道是否有一种更优雅的方法来使用foreach.tanks in prevair:) 编辑:正如Jon Skeet指出的,上面的代码将新的按钮实例分配给迭代变量。哎呀。基于其他评论,我相信最实用的使用是一个正常循环。这是我要用的版本。谢谢大家的帮助!

  • 本文向大家介绍深入了解java8的foreach循环,包括了深入了解java8的foreach循环的使用技巧和注意事项,需要的朋友参考一下 虽然java8出来很久了,但是之前用的一直也不多,最近正好学习了java8,推荐一本书还是不错的<写给大忙人看的javase8>。因为学习了Java8,所以只要能用到的地方都会去用,尤其是Java8的Stream,感觉用起来觉得很方便,因为点点点就出来了,而且

  • 本文向大家介绍如何在PowerShell foreach并行循环中使用PSCustomObject?,包括了如何在PowerShell foreach并行循环中使用PSCustomObject?的使用技巧和注意事项,需要的朋友参考一下 要在Foreach并行循环内使用PSCustomObject ,我们首先需要考虑如何在循环内使用变量。 因此,让我们看看是否可以在$out变量中存储或更改值。 示例

  • 问题内容: 在循环中使用/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。 这段代码确实有效,但是这可能会出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用/ ,所以我只是想问一下这是否有问题。 问题答案: 确保代码确实有效,但是我很确定它不会执行您期望的功能。它只会触发多个异步调用,但此后函数会立即返回。 顺序阅读 如果要顺序读取文件, 则不能使用。只需使用现代循环即可,该循环将按预

  • 我想通过foreach循环显示blade上的一些数据,如下所示: 但我需要根据降序检索这些数据。那么我如何将这个条件添加到循环中。 如果你们能分享你们的想法或建议我会很感激的... 提前道谢。