Что такое представление Runnable в java.util.function? - PullRequest
0 голосов
/ 29 июня 2019

Мне недавно стало интересно, как Runnable очень часто используется в функциональном контексте.В то же время, согласно javadoc, его семантическое значение очень близко к многопоточности, хотя он не всегда используется в таком контексте:

Интерфейс Runnable должен быть реализован любым классом, экземпляры которого предназначены для выполненияпо темеКласс должен определять метод без аргументов, который называется run.Этот интерфейс предназначен для предоставления общего протокола для объектов, которые хотят выполнять код, пока они активны.Например, Runnable реализуется классом Thread.Быть активным просто означает, что поток был запущен и еще не был остановлен.

Является ли Runnable эквивалентным Supplier<Void>?Или Runnable эквивалентно Function<Void,Void> и почему тогда он не Поставщик? Как Runnable выравнивается с пакетом java.util.function, уже представившим функциональные интерфейсы.

1 Ответ

7 голосов
/ 29 июня 2019

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 вам не нужно (и не может).

...