Недавно мне было интересно, поскольку Runnable очень часто используется в функциональном контексте. В то же время согласно javadoc его семантическое значение очень близко к многопоточности, хотя и не всегда используется в таком контексте:
The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. The class must define a method of no arguments called run. This interface is designed to provide a common protocol for objects that wish to execute code while they are active. For example, Runnable is implemented by class Thread. Being active simply means that a thread has been started and has not yet been stopped.
Является ли Runnable эквивалентом Supplier<Void> ? Или Runnable эквивалентно Function<Void,Void> и почему тогда это не Поставщик? Как Runnable согласуется с уже представленными функциональными интерфейсами пакета java.util.function.
@Sweeper Суть вопроса не в этом. Конечно.
В чем тогда смысл? Что именно вы спрашиваете?
@Sweeper, это вопрос семантики. Я могу использовать салфетки как детские салфетки или как кухонную бумагу. Но даже если материал один и тот же, они бывают с разными названиями и вкусами.
@AlexandarPetrov больше о Поставщике<Void>
@DanielTaub ах спасибо!!!! Мой вопрос был неправильным :)
Я бы сказал, что это просто Function<Void, Void>. @ДэниелТауб
Я отредактировал вопрос, который имел в виду Поставщик, а не Потребитель. Так почему же это не поставщик или функция?
Runnable намного старше, чем функции, и не был модернизирован в новый фреймворк. Вы слишком много думаете об этом.
@AlexandarPetrov Я думаю, что Runnable - это семантически хорошее имя для контекста, в котором оно будет использоваться. Это функциональный интерфейс, который ничего не производит и не потребляет, поэтому можно сказать, что метод свободен от какого-либо контекста, по сути, являясь блоком кода для запуска. Я не могу придумать ни одного сценария, в котором это имя было бы неточным.




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 вам не нужно (и нельзя).
Спасибо за ответ. Просто любопытно, если бы Runnable был помещен в функцию jl, как бы он назывался по-прежнему Runnable?
Runnable, возможно, Executable (который, что достаточно интересно, является интерфейсом до 1.8, соответствующим Поставщику, но этот БЫЛ переосмыслен как Поставщик. На это есть причины (Исполняемый файл не находится в java.lang, и броски, которые не связать с тем, что делают все интерфейсы jlfunction).
На самом деле это java.util.function вместо j.l.function.
Спасибо, что заметили это и исправили, @MCEmperor :)
Runnableсам по себе функциональный интерфейс, не так ли? Для него нет необходимости в эквиваленте вjava.util.function.