Что такое представление Runnable в java.util.function?

Недавно мне было интересно, поскольку 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.

Runnable сам по себе функциональный интерфейс, не так ли? Для него нет необходимости в эквиваленте в java.util.function.
Sweeper 29.06.2019 11:48

@Sweeper Суть вопроса не в этом. Конечно.

Alexander Petrov 29.06.2019 11:49

В чем тогда смысл? Что именно вы спрашиваете?

Sweeper 29.06.2019 11:50

@Sweeper, это вопрос семантики. Я могу использовать салфетки как детские салфетки или как кухонную бумагу. Но даже если материал один и тот же, они бывают с разными названиями и вкусами.

Alexander Petrov 29.06.2019 11:52

@AlexandarPetrov больше о Поставщике<Void>

Daniel Taub 29.06.2019 11:52

@DanielTaub ах спасибо!!!! Мой вопрос был неправильным :)

Alexander Petrov 29.06.2019 11:54

Я бы сказал, что это просто Function<Void, Void>. @ДэниелТауб

Sweeper 29.06.2019 11:54

Я отредактировал вопрос, который имел в виду Поставщик, а не Потребитель. Так почему же это не поставщик или функция?

Alexander Petrov 29.06.2019 11:56
Runnable намного старше, чем функции, и не был модернизирован в новый фреймворк. Вы слишком много думаете об этом.
Thorbjørn Ravn Andersen 29.06.2019 12:15

@AlexandarPetrov Я думаю, что Runnable - это семантически хорошее имя для контекста, в котором оно будет использоваться. Это функциональный интерфейс, который ничего не производит и не потребляет, поэтому можно сказать, что метод свободен от какого-либо контекста, по сути, являясь блоком кода для запуска. Я не могу придумать ни одного сценария, в котором это имя было бы неточным.

MC Emperor 29.06.2019 13:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
10
1 408
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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?

Alexander Petrov 29.06.2019 12:57

Runnable, возможно, Executable (который, что достаточно интересно, является интерфейсом до 1.8, соответствующим Поставщику, но этот БЫЛ переосмыслен как Поставщик. На это есть причины (Исполняемый файл не находится в java.lang, и броски, которые не связать с тем, что делают все интерфейсы jlfunction).

rzwitserloot 29.06.2019 16:26

На самом деле это java.util.function вместо j.l.function.

MC Emperor 29.06.2019 21:09

Спасибо, что заметили это и исправили, @MCEmperor :)

rzwitserloot 04.11.2020 16:57

Другие вопросы по теме