尝试在流Java8中捕获

尝试在流Java8中捕获,java,java-8,java-stream,try-catch,Java,Java 8,Java Stream,Try Catch,我尝试在流上使用map,并在map函数上使用try/catch,但我得到一个错误: 缺少返回语句 公共流比例(列表值,整数因子){ 返回值。stream() .map(n->{ 试一试{ 返回n/因子; }捕获(算术异常){ e、 printStackTrace(); } }); } 您必须从map返回一个整数。如果这对您的用例有意义,那么该值可以是null。如果流的使用者能够处理null值,则可以执行此操作 .map(n->{ 试一试{ 返回n/因子; }捕获(算术异常){ e、 printS

我尝试在流上使用map,并在map函数上使用try/catch,但我得到一个错误:

缺少返回语句

公共流比例(列表值,整数因子){
返回值。stream()
.map(n->{
试一试{
返回n/因子;
}捕获(算术异常){
e、 printStackTrace();
}
});
}

您必须从
map
返回一个
整数。如果这对您的用例有意义,那么该值可以是
null
。如果
流的使用者能够处理
null
值,则可以执行此操作

.map(n->{
试一试{
返回n/因子;
}捕获(算术异常){
e、 printStackTrace();

return null;//这是一个相同的错误,就像您有一个如下函数一样:

public int foo() {
    if (bar()) return 1;
}
如果
bar()
返回false,则此函数不会返回编译器不满意的任何内容。您必须返回某些内容。您可以选择:

  • 表示错误的明显整数值,例如,-1,0,最有可能在
    静态最终int
    中定义
  • null
    ,尽管这可能会导致流中稍后出现
    NullPointerException
    s,因此值得避免
  • Optional
    尽管这需要更改流中的后续操作以选中
    Optional.isPresent()

另一方面,RxJava有很好的功能,可以优雅地处理这类事情。

您必须在
catch
块中或在try/catch之后返回一个
Integer
。这可能是
null
。那么,当抛出
算术异常时,应该返回什么值?您是否返回它?在哪里?或者干脆去掉try/catch。
的消费者期望什么?他能够处理
null
值吗?将结果类型更改为
Stream
?我不认为返回null是个好主意,可能在这两种情况下都返回
可选
?我不建议使用
null
s在流中。我希望至少返回
Optional
,或者在map中使用此代码之前只做一个
因子!=0
,并抛出一个
IllegalArgumentException
。你们都是对的。但因为我们不知道结果流是如何使用的,所以让我们保持简单。这些选项简单明了当前的OPs代码。或者您会在自己的解决方案中编写这样的代码吗?您可以在答案中包含所有可能的解决方案及其优缺点-我猜这是SO的目的-教授。您的答案与流,尤其是
map
,有何关系?这与流没有具体关系,但与“缺少返回语句错误”。当我第一次遇到这个错误时,我感到困惑,因为我不知道语句lambdas需要返回语句,而表达式lambdas不需要。
public int foo() {
    if (bar()) return 1;
}