Какой цели служит интерфейс `SerializableFunction`, определенный в Vaadin 8, если мы можем просто передать вместо него регулярное лямбда-выражение?

Vaadin 8 определяет функциональный интерфейс, SerializableFunction,

Этот интерфейс появляется в разных местах. Например, при определении Converter для отображения нетекстовых типов в TextField такой как UUID,

Binder.BindingBuilder<BEAN,TARGET>::withConverter(SerializableFunction<TARGET,NEWTARGET> toModel, SerializableFunction<NEWTARGET,TARGET> toPresentation)

Смотрите документацию к классу.

Пример использования:

binder
.forField( this.idField )
.withConverter( text -> UUID.fromString( text ) , uuid -> uuid.toString() )
.bind(Panel :: getId , null );

Обратите внимание, что в этом примере мы просто передаем пару простых лямбда-выражений:

  • text -> UUID.fromString( text )
  • uuid -> uuid.toString()

Мои два вопроса:

  • Как получается, что обычная лямбда может быть вставлена ​​в место, где этот конкретный тип SerializableFunction необходимо? Как квалифицировалось мое лямбда-выражение?
  • Почему команда Vaadin удосужилась определить интерфейс SerializableFunction может ли какая-нибудь старая добрая лямбда уместиться на своем месте?

Моя цель здесь не столько в деталях Vaadin (хотя мне это тоже интересно), сколько в системе типов Java, лямбдах и функциональном программировании.

Я понимаю, почему веб-приложениям Vaadin нужно, чтобы каждый объект был сериализуемым: в случае, когда при развертывании веб-контейнер выбирает перемещение пользовательского сеанса между серверами приложений. Мой вопрос не о сериализации. Мой вопрос о механике типов языка Java и о том, что хорошего в том, чтобы добавить дополнительный интерфейс, не требующий дополнительного кодирования.


Я даже не буду спрашивать, что означает для лямбда-выражения быть сериализуемым, так как это делает мою голову болит.

1 ответ

В целом, в Vaadin 8 API был модернизирован для использования функций Java 8. И лямбда - те, которые используются чаще всего. Binder является хорошим примером этого и некоторых других местах. Например, использование слушателей становится более свободным с Lambdas. По традиции для Vaadin требовалось, чтобы сеансы были полностью сериализуемыми, поскольку в некоторых особых случаях это необходимо. Хотя мы в основном предпочитаем использовать липкие сеансы в кластерных развертываниях, также возможно проектировать приложения Vaadin для высокой доступности. Чтобы сохранить эту возможность, все, что мы используем, должно быть сериализуемым. Следовательно, есть, например, SerializableFunction, SerializablePredicate, SerializableBiFunction, SerializableBiPredicate, SerializableConsumer, SerializableComparator,...

Это не что иное, как "прокси" для стандартных эквивалентов Java 8. Как, например, SerializableFunction расширяет стандартную функцию Java 8 и реализует Serializable. Следовательно, он использует лямбда-выражение точно таким же образом.

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html

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