java.util.function中的Runnable表示是什么?

Ale*_*rov 0 java lambda functional-programming runnable java-8

最近,我想知道Runnable经常在功能上下文中使用。同时,根据javadoc,它的语义非常接近多线程,但在这种情况下并没有使用它:

Runnable接口应该由实例打算由线程执行的任何类实现。该类必须定义一个没有参数的方法,称为run。该接口旨在为希望在活动状态下执行代码的对象提供通用协议。例如,Runnable由Thread类实现。处于活动状态仅表示线程已启动但尚未停止。

Runnable相当于Supplier<Void>?或Runnable等同于Function<Void,Void>,为什么不是供应商呢?Runnable如何与已经提供的功能接口的java.util.function包对齐。

rzw*_*oot 7

Runnable是吗。有一个故意的选择(请参见Brian Goetz),不要在java.util.function软件包中添加与等效的功能接口Runnable。Java实现lambda背后的主要思想之一(所有使用都必须在需要某些功能接口的地方,然后lambda才成为该功能接口的实现的思想)旨在确保Java post-lambda是或多或少与lambda之前设计的API兼容,而实际上不需要发布不兼容的“ v2”版本,该版本具有适用于大多数现有API的更多Java8 +风格的API。

引入一个Runnable单独的变体以使其存在于java.util.function软件包中将与该想法背道而驰。

请注意,RunnableSupplier<Void>Function<Void, Void>可能感觉非常相似,但在javaland中完全不兼容。Void不特别 它只是一种类型,与其他类型相同。例如,如果您要制作Supplier<Void>lambda,则实际上需要返回一些东西,并且只能返回null; 没有非hacky的方法来创建该Void类型的实例。而对于void,您不必(也不能)。