gpt4 book ai didi

java-8 - 为什么我们不能在 Java 8 流中抛出异常?

转载 作者:行者123 更新时间:2023-12-04 22:42:26 27 4
gpt4 key购买 nike

例如:

Person result = persons.stream()
.filter(x -> {
if ("test".equals(x.getName() ) ) {
throw new IOException("not possible inside stream y ?"); //any checked exception
}
//code here
})

M 正在寻找不被允许的原因?即使声明代码的方法抛出 IOException

最佳答案

除了 throw new ... 末尾缺少分号外,您的代码运行良好行,并且由于缺少可能隐藏在 // code here 中的 return 语句.

你不能做的是抛出一个已检查的异常(RuntimeException 不是),因为已检查的异常是方法签名的一部分,而 Predicate.test 方法没有声明一个。

编辑 :
要更准确地了解正在发生的事情以及为什么不能在此处抛出已检查的异常,以下是在没有 lambda 的情况下编写代码的方法:

由此 :

public Person myMethod() throws IOException {
Person result = persons.stream()
.filter(x -> {
if ("test".equals(x.getName() ) ) {
throw new IOException("not possible inside stream y ?"); //any checked exception
}
//code here
return true;
});
return person;
}

对此:
public Person myMethod() throws IOException {
Person result = persons.stream()
.filter(new Predicate<Person>() {
public boolean test(Person x) {
if ("test".equals(x.getName() ) ) {
throw new IOException("not possible inside stream y ?"); //any checked exception
}
//code here
return true;
}
});
return person;
}

如您所见,lambda 表达式内的代码现在位于 test 内。匿名方法 Predicate类,它没有声明任何已检查的异常。

为什么 Predicate ?因为它是 filter方法是预期的,你可以使用 lambda 代替传统的对象,因为它是一个单一的方法接口(interface):只有 test是抽象的,您的 lambda 签名应该与 Predicate.test 相同方法。

如果您真的希望能够处理已检查的异常, linked post (在 Frederico 的评论中)展示了一些绕过这些限制的方法。

关于java-8 - 为什么我们不能在 Java 8 流中抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739139/

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