是否有一个标准的Java8功能接口用于抛出选中异常的块?

是否有一个标准的Java8功能接口用于抛出选中异常的块?,java,lambda,java-8,Java,Lambda,Java 8,Callable抛出异常,Runnable不抛出异常 有什么标准看起来像吗 @FunctionalInterface public interface TypedBlock<E extends Exception> { public void run() throws E; } @functioninterface 公共接口类型锁{ 公开作废; } 不,据我所知,没有内置功能。但您可以使用外部库(以及许多其他很酷的功能) 您可以使用,其中可以使用类来实现此目的 该页面中的示

Callable抛出异常,Runnable不抛出异常

有什么标准看起来像吗

@FunctionalInterface
public interface TypedBlock<E extends Exception> {
    public void run() throws E;
}
@functioninterface
公共接口类型锁{
公开作废;
}

不,据我所知,没有内置功能。但您可以使用外部库(以及许多其他很酷的功能)

您可以使用,其中可以使用类来实现此目的

该页面中的示例用一个
IOException

Arrays.stream(dir.listFiles()).forEach(
    Unchecked.consumer(file -> { System.out.println(file.getCanonicalPath()); })
);
另一种(我认为更好的)方法是使用功能性设计的库,如

一个好的方法是将您的任务包装在一个
验证中
,以确定结果是否成功。这可能是这样的:

TypedBlock<IOException> foo = ...;

// do your work
final Validation<IOException, Unit> validation = Try.f(() -> {
  foo.run();
  return Unit.unit(); // Unit equals nothing in functional languages
})._1();

// check if we got a failure
if (validation.isFail()) {
  System.err.println("Got err " + validation.fail());
}

// check for success
if (validation.isSuccess()) {
  System.out.println("All was good :-)");
}

// this will just print out a message if we got no error
validation.forEach(unit -> System.out.println("All was good"));
TypedBlock foo=。。。;
//做你的工作
最终验证=Try.f(()->{
foo.run();
return Unit.Unit();//在函数式语言中,Unit等于零
})._1();
//检查我们是否有故障
if(validation.isFail()){
System.err.println(“Got err”+validation.fail());
}
//检查是否成功
if(validation.issucess()){
System.out.println(“一切都很好:-”);
}
//如果没有错误,这将只打印一条消息
validation.forEach(unit->System.out.println(“一切都很好”);

有一个
java.lang.AutoCloseable
,它有一个
()->{}抛出异常
签名,但是,它有一个预定义的语义负担。因此,对于特殊用途,它可能是合适的,但当您设计API时,我建议您定义自己的
接口

请注意,您的专用接口仍然可以扩展
可调用
,成为标准的
接口

interface Block<E extends Exception> extends Callable<Void>{
    void run() throws E;
    @Override default Void call() throws E { run(); return null; }
    /** This little helper method avoids type casts when a Callable is expected */
    static <T extends Exception> Block<T> make(Block<T> b) { return b; }
}

注意静态方法
Block.make的技巧。如果没有它,您将不得不将lambda表达式转换为
(Block)
,而不是从改进的类型推断中获益。这仅在需要
可调用
的情况下才有必要,对于需要
的您自己的API,您可以直接使用lambda表达式和方法引用。

没有AFAIK
Callable
返回null。请注意,实现者可以自行定义更多受限制的异常类型:
类MyCallable implements Callable{public Void call()抛出IOException{…}
==“我将只抛出IOExceptions”,返回null是lambdas和方法引用的一个难题。呸,显然您是在自定义代码中使用它。使用您自己的界面。
// Example
ExecutorService e=Executors.newSingleThreadExecutor();
try {
    e.submit(Block.make(()->{ throw new IOException("test"); })).get();
} catch (InterruptedException ex) {
    throw new AssertionError(ex);
} catch (ExecutionException ex) {
    System.out.println("received \""+ex.getCause().getMessage()+'"');
}
e.shutdown();