Runnable
это так. Был намеренный выбор (см. Брайан Гетц здесь ) не добавлять функциональный интерфейс в пакет java.util.function
, который фактически эквивалентен Runnable
. Одна из основных идей, лежащих в основе реализации лямбда-выражений в Java (идея о том, что все ее использование должно быть там, где требуется некоторый функциональный интерфейс, и что лямбда-то становится реализацией этого функционального интерфейса), предназначена для обеспечения того, чтобы Java-лямбда была более или менее совместимый с предварительно лямбда-интерфейсами API, без реальной необходимости выпуска несовместимой версии 'v2' с более API-стилем Java8 + для большинства существующих API.
Представление варианта Runnable
исключительно для его существования в пакете java.util.function
противоречит этой идее.
Обратите внимание, что Runnable
и Supplier<Void>
и Function<Void, Void>
могут показаться очень похожими, но совершенно несовместимы в javaland. Void
не особенный; это просто тип, такой же, как и любой другой. Например, если вы делаете Supplier<Void>
лямбду, вам нужно что-то вернуть, и вы можете только вернуть null
; нет нехакерского способа создания экземпляров типа Void
. Принимая во внимание, что для void
вам не нужно (и не может).