And*_*rey 3 java lambda java-8 functional-interface
我正在使用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();
Run Code Online (Sandbox Code Playgroud)
如果我删除try catch块并声明抛出该方法的异常,代码将编译并正常运行.
Creatable<MyObject> creator = () -> new MyObject();
Run Code Online (Sandbox Code Playgroud)
编译错误是:
incompatible types: bad return type in lambda expression
你的lambda需要返回一个MyObject.如果try块成功完成,则情况如此,但如果不catch执行,则执行的块不会返回任何内容.所以你可以写:
Creatable<MyObject> creator = () -> {
try {
return new MyObject();
} catch (IOException e) {
e.printStackTrace();
return null;
}
};
Run Code Online (Sandbox Code Playgroud)
但是接下来你会得到另一个编译错误:"在try块中永远不会抛出IOException".所以你还需要一个构造函数MyObject抛出IOException:
class MyObject { MyObject() throws IOException {} }
Run Code Online (Sandbox Code Playgroud)
最后,除非MyObject实际抛出异常,否则您可以简单地使用:
Creatable<MyObject> creator = () -> new MyObject();
Run Code Online (Sandbox Code Playgroud)
你也可以写:
Creatable<MyObject> creator = MyObject::new;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1836 次 |
| 最近记录: |