假设我在Java 8中有以下功能接口:

interface Action<T, U> {
   U execute(T t);
}

在某些情况下,我需要一个没有参数或返回类型的操作.所以我写

Action<Void, Void> a = () -> { System.out.println("Do nothing!"); };

但是,它给了我编译错误,我需要把它写成

Action<Void, Void> a = (Void v) -> { System.out.println("Do nothing!"); return null;};

这很难看.有没有办法go 掉Void类型的参数?

推荐答案

您要使用的语法可以通过一个小帮助器函数将Runnable转换为Action<Void, Void>(例如,您可以将其放在Action中):

public static Action<Void, Void> action(Runnable runnable) {
    return (v) -> {
        runnable.run();
        return null;
    };
}

// Somewhere else in your code
 Action<Void, Void> action = action(() -> System.out.println("foo"));

Java相关问答推荐

如何用javac编译Java类,即使对像java.lang.*这样的基本类也没有任何依赖关系?

int Array Stream System. out. print方法在打印Java8时在末尾添加% sign

Java Stream,需要更新列表对象列表

如何在带有Micronaut的YAML中使用包含特殊字符的字符串作为键

如何判断一个矩阵是否为有框矩阵?

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

编译多个.Java文件并运行一个依赖于用户参数的文件

Java中实现的归并排序算法给出ArrayIndexOutOfBound异常

SpringBoot+Java 17@Valid未验证POJO

Arrays.hashcode(int[])为不同的元素提供相同的散列

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

在Java 15应用程序中运行Java脚本和Python代码

使用Jackson库反序列化json

删除打印语句会影响功能...腐败在起作用?

错误:不兼容的类型:Double不能转换为Float

如何使这两种方法合二为一?

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

在ECLIPSE上的M1 Pro上运行JavaFX的问题

如何设计包含已知和未知键值对映射的Java类?

如何从指定某些字段的父对象创建子对象