我最近在想,Runnable经常在功能上下文中使用。同时,根据javadoc,它的语义意义非常接近多线程,而在这种情况下并不总是使用它:
Runnable接口应该由其实例要由线程执行的任何类实现。类必须定义一个没有参数的方法,称为run。此接口旨在为希望在活动时执行代码的对象提供通用协议。例如,Runnable是由类Thread实现的。活动意味着线程已经启动,但尚未停止。
Runnable 是否等同于 Supplier<Void> ?或者,Runnable 是否等同于 Function<Void,Void> ,为什么它不是供应商呢?如何使Runnable与已经提供的功能接口相一致。
发布于 2019-06-29 10:47:30
Runnable就是它。有一种有意的选择(请参阅Brian Goetz here),即不向java.util.function包添加一个与Runnable等效的功能接口。Java实现lambdas的主要思想之一(即它的所有用途都必须在需要某些功能接口的地方,并且lambda随后成为该功能接口的实现)的目的之一是确保Java8+或多或少地与设计好的预-lambda API兼容,而不需要为现有的大多数API发布不兼容的“v2”版本和更多的Java8+风格的API。
引入Runnable的一个变体仅仅是为了让它存在于java.util.function包中,这与这种想法是背道而驰的。
请注意,Runnable、Supplier<Void>和Function<Void, Void>可能感觉非常相似,但在javaland中完全不兼容。Void没有什么特别之处;它只是一种类型,与任何其他类型一样。例如,如果您正在制作一个Supplier<Void> lambda,那么您实际上需要返回一些东西,并且只能返回null;没有一种非黑客的方法来创建Void类型的实例。而对于void,您不必(也不能)。
https://stackoverflow.com/questions/56816550
复制相似问题