可运行的抛出异常可以被Lambda取代?

时间:2017-02-25 09:55:19

标签: java intellij-idea lambda runnable

Runnable runnable = new Runnable() {
   @Override
   public void run() {
       throw new RuntimeException("You cannot Pass!");
   }
};

假设我有一个像上面提到的那样的可运行的东西。 IntelliJ报告说,从Java 8开始,所有匿名类都可以被lambdas替换。

有人可以用正确的语法帮助我。

需要使用runnable作为参数调用的函数:

public void intercept(Runnable runnable) { ... }
PS:关于为什么有人需要这样的可运行不是问题,谢谢

2 个答案:

答案 0 :(得分:2)

Lambdas可用于定义Runnable接口,因此不需要进行太多更改:

Runnable runnable = () -> {
   throw new RuntimeException("You cannot Pass!");
};

()是声明无参数的语法 - 将其与例如用于定义BiFunction<String, Integer, String>的两个参数列表:

BiFunction<String, Integer, String> fooBarConcatenator = (foo, bar) -> foo + bar;

答案 1 :(得分:1)

Runnable的方法不带参数,因此代码如下:

Runnable r = () -> { throw new RuntimeException(); };

但是,请注意,您将无法抛出已检查的异常,因为Runnable的run()没有定义的已检查异常。要实现这一点,您必须定义自己的功能接口并定义包装Runnable的lambda。请查看this了解更多信息。

此外,许多现代IDE(特别是Intellij)为您提供了自动替换此类替换的提示。因此,请在屏幕左侧检查一个小警告图标,单击该图标时将自动使用相应的lambda表达式替换您的代码。或者,单击特定行中的 Alt + Enter Cmd + 输入 for Mac)。