如果我们可以简单地在Vaadin 8中传递一个正则Lambda表达式,那么Vaadin 8中定义的“SerializableFunction”接口有什么用途?

如果我们可以简单地在Vaadin 8中传递一个正则Lambda表达式,那么Vaadin 8中定义的“SerializableFunction”接口有什么用途?,lambda,types,vaadin,vaadin8,functional-interface,Lambda,Types,Vaadin,Vaadin8,Functional Interface,定义一个 这个界面出现在不同的地方。例如,定义用于在中显示非文本类型的时,例如 请注意,在该示例中,我们只需传递一对简单的: text->UUID.fromString text uuid->uuid.toString 我的两个问题: 一个普通的Lambda是如何滑入一个需要特定类型SerializableFunction的地方的?我的Lambda表达式是如何限定的? 如果任何简单的旧Lambda都能适应,为什么Vaadin团队还要费心定义接口SerializableFunction呢? 我在这

定义一个

这个界面出现在不同的地方。例如,定义用于在中显示非文本类型的时,例如

请注意,在该示例中,我们只需传递一对简单的:

text->UUID.fromString text uuid->uuid.toString 我的两个问题:

一个普通的Lambda是如何滑入一个需要特定类型SerializableFunction的地方的?我的Lambda表达式是如何限定的? 如果任何简单的旧Lambda都能适应,为什么Vaadin团队还要费心定义接口SerializableFunction呢? 我在这里的目标不是关于Vaadin的细节,尽管我对它也很好奇,而是关于Java类型系统、Lambdas和函数式编程

我理解为什么Vaadin web应用程序需要每个对象都是:在部署时,用户选择在应用程序服务器之间移动用户会话。我的问题不是关于序列化方面。我的问题是关于Java语言类型的机制,以及添加不需要额外编码的额外代码有什么好处


我甚至不会问Lambda表达式可序列化意味着什么,因为它会伤到我的头。

通常在Vaadin 8中,API经过了现代化,可以利用Java 8的功能。Lambda's是使用最多的。Binder就是一个很好的例子,其他一些地方也是如此。例如,使用Lambdas时,侦听器的使用变得更加流畅。传统上,Vaadin要求会话可以完全序列化,因为在某些特殊情况下需要它。尽管我们更喜欢在集群部署中使用粘性会话,但也可以为高可用性设计Vaadin应用程序。为了保持这种可能性,我们使用的所有东西都需要序列化。因此有SerializableFunction、SerializablePredicate、SerializableBiFunction、SerializableBiPredicate、SerializableConsumer、SerializableComparator等

这些只是标准Java8等价物的代理。例如,扩展标准Java8并实现可序列化。因此,它以完全相同的方式使用Lambda表达式


在我的问题中,我应该说我理解让Vaadin应用程序中的所有内容都可序列化的必要性。我的问题是关于语言类型的机制,我传递一个正则lambda表达式如何实现SerializableFunction接口?感谢@BasilBourque的评论,我重新制定了我的答案。编写lambda语法只是一个java速记,为实现单个方法接口的开发人员创建一个类。编译器推断类型。这和瓦丁没有什么特别的联系。
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 );