gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:40:32 24 4
gpt4 key购买 nike

假设我们尝试将一个可能抛出已检查异常的 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);
}
});

另一种解决方法是转换 limited功能 forEachplain old foreach loop这对检查的异常更友好。

但是天真的方法失败了:

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<T> not implement Iterable<T>?side answer这并不能真正回答这个问题本身。我认为这不足以将这个问题定性为与那个问题重复,因为他们会问不同的问题。

最佳答案

By definition foreach 循环需要 Iterable被传入。

可以通过匿名类来实现:

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

这可以简化为 lambda因为 Iterablefunctional interface :

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

这可以转换为 method reference :

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

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

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

还有StreamEx maven Central 中的库,具有可迭代的流和其他开箱即用的特性。


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

Java 8 Lambda function that throws exception?

Java 8: Lambda-Streams, Filter by Method with Exception

How can I throw CHECKED exceptions from inside Java 8 streams?

Java 8: Mandatory checked exceptions handling in lambda expressions. Why mandatory, not optional?

jOOλ Unchecked

Lombok @SneakyThrows

Kotlin ;)

关于java - 如何在java 8流上使用foreach循环进行迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31702989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com