3

我正在使用 lambda 表达式进行一些测试,但我的代码无法编译。我的 lambda 实现是错误的还是异常处理?以下代码的正确实现是什么?

class MyObject { }

interface Creatable<T> {
    T create() throws IOException;
}

/* Using the code: */
Creatable<MyObject> creator = () ->  {
    try {
        return new MyObject();
    } catch (IOException e) {
        e.printStackTrace();
    }
};

MyObject obj1 = creator.create();

如果我删除 try catch 块并声明要在方法中抛出的异常,则代码编译并正常运行。

Creatable<MyObject> creator = () -> new MyObject();

编译错误是:

incompatible types: bad return type in lambda expression

4

3 回答 3

6

您的 lambda 需要返回一个MyObject. 如果try块成功完成就是这种情况,但如果没有成功,则catch执行不返回任何内容的块。所以你可以写:

Creatable<MyObject> creator = () ->  {
    try {
        return new MyObject();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
};

但是你会得到另一个编译错误:“IOException is never throw in try block”。所以你还需要有一个构造函数,MyObject它会抛出一个IOException

class MyObject { MyObject() throws IOException {} }

最后,除非MyObject实际抛出异常,否则您可以简单地使用:

Creatable<MyObject> creator = () -> new MyObject();

你也可以写:

Creatable<MyObject> creator = MyObject::new;
于 2014-06-03T00:36:54.033 回答
1

Lambda 需要所有路径来返回上一个答案中提到的值,简单的解决方案是在 catch 块的末尾返回

然而,当使用 lambda 时,有一种更优雅的方式来处理异常

你可以用另一个例子包装一个lambda wrap(((x,y)->x/y))

Biconsumer<Integer,Integer> consumer wrap(Biconsumer<Integer,Integer> consumer)    
{    
return (v,k)->{try

{consumer.apply()}

catch(){};

}

https://www.youtube.com/watch?v=YLKMCPMLv60&list=PLqq-6Pq4lTTa9YGfyhyW2CqdtW9RtY-I3&index=18

于 2018-12-24T05:09:14.053 回答
0
@FunctionalInterface
public interface CreateThrowable<T, R, E extends Throwable> {
   R create(T t) throws E;
static <T, R, E extends Throwable> Function<T, R> uncheckedException(ThrowingFunction<T, R, E> f) {
    return t -> {
        try {
            return f.create(t);
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
    };
}

}

于 2019-10-09T05:22:34.073 回答