当前位置:  开发笔记 > 编程语言 > 正文

带序列化的Java 8 Lambda表达式

如何解决《带序列化的Java8Lambda表达式》经验,为你挑选了1个好方法。

在我们的Web应用程序项目中,我们使用Redis来管理会话.为了支持它,我们正在序列化将存储在会话中的任何对象.

例如,我们使用DTO来保存用于在屏幕上显示的bean数据.即使DTO内部有任何其他对象(组合),我们也必须序列化它,否则我们得到NotSerializableException.

当我创建一个匿名内部类来实现Comparator下面这样的时候,我遇到了一个问题:

Collections.sort(people, new Comparator() {
    public int compare(Person p1, Person p2) {
        return p1.getLastName().compareTo(p2.getLastName());
    }
});

上面的代码抛出了NotSerializableException,我通过创建一个实现Comparator以及Serializable接口的类来解决它.问题是,它被抛入JSP使用此DTO 的页面内.我不得不做很多调试才能找到实际问题.

但是现在,我想知道更改上面的代码以使用如下的Lambda表达式:

Collections.sort(people, (p1, p2) -> p1.getLastName().compareTo(p2.getLastName()));

但是,我担心可能会发生同样的异常.Lambda表达式是否在内部创建对象?



1> Holger..:

您可以通过创建可序列化的lambda表达式

Collections.sort(people, (Comparator&Serializable)
    (p1, p2) -> p1.getLastName().compareTo(p2.getLastName()));

但应该注意的是,创建一个Comparatorvia

(p1, p2) -> p1.getLastName().compareTo(p2.getLastName())

沮丧的冗余.getLastName()在两种情况下,您都要调用两次并且必须在右侧参数变量上调用它.它更直接易用

Comparator.comparing(Person::getLastName)

代替.你也可以使这个比较器可序列化,虽然这意味着失去了很多简洁:

Collections.sort(people,
    Comparator.comparing((Function&Serializable)Person::getLastName));

这也更加强大.lambda表达式的序列化形式包含对实现方法的引用,在第一个变体中,使用编译器生成的名称的合成方法在定义方法中使用另一个lambda表达式时可能会更改.相反,Person::getLastName将指定的方法指向getLastName实现方法(至少使用javac).

但通常,可序列化的lambda表达式可能包含令人惊讶的编译器依赖性,应谨慎使用.

由于它们旨在描述行为而不是数据,因此无论如何长期存储都没有意义.要在具有相同代码库的JVM之间传输它们,它们就足够了.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有