Lambda,会序列化吗?

因此,我一直在思考Tyrus项目所需的增强功能,该功能允许用户广播到跨机器集群连接到URL的客户端子集。 有多种方法可以做到这一点; 但是自从我使用JDK 8以来,这个问题肯定看起来像钉子。


为此,我创建了一个简单的单元测试类,该类将使用我的过滤器,将其序列化到磁盘,读回它,然后执行它。 它有一个实例字段“ VALUE”,我们可以使用它直接或间接引用以找出导致序列化失败的原因。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.NotSerializableException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;import java.util.function.Predicate;import org.junit.Test;public class SerializablePredicateFilterTest {public String VALUE = "Bob";public interface SerializablePredicate<T> extends Predicate<T>, Serializable {}public <T> void filter(SerializablePredicate<T> sp, T value) throws IOException, ClassNotFoundException {sp.getClass().isLocalClass();File tempFile = File.createTempFile("labmda", "set");try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(tempFile))) {oo.writeObject(sp);}try (ObjectInput oi = new ObjectInputStream(new FileInputStream(tempFile))) {SerializablePredicate<T> p = (SerializablePredicate<T>) oi.readObject();System.out.println(p.test(value));}}}

因此,为了进行校准,请确保匿名内部类将失败,因为它始终包含对封闭对象的引用……。

@Test(expected = NotSerializableException.class)public void testAnonymousDirect() throws IOException, ClassNotFoundException {String value = VALUE;filter(new SerializablePredicate<String>() {@Overridepublic boolean test(String t) {return value.length() > t.length();}}, "Bob");}

本地类也是如此,您不使用本地类吗?

@Test(expected = NotSerializableException.class)public void testLocalClass() throws IOException, ClassNotFoundException {class LocalPredicate implements SerializablePredicate<String> {@Overridepublic boolean test(String t) {// TODO Implement this methodreturn false;}}filter(new LocalPredicate(), "Bobby");}

因此,当然可以使用独立的类,在这种情况下,为方便起见,可以使用嵌套类。

public static class LengthPredicate implements SerializablePredicate<String> {private String value;public LengthPredicate(String value) {super();this.value = value;}public void setValue(String value) {this.value = value;}public String getValue() {return value;}@Overridepublic boolean test(String t) {// TODO Implement this methodreturn false;}}@Testpublic void testStaticInnerClass() throws IOException, ClassNotFoundException {filter(new LengthPredicate(VALUE), "Bobby");}

因此,让我们开始使用JDK 8,事实证明,我的第一次尝试也失败了,但它确实确认序列化对于使用Lambda非常满意。

@Test(expected = NotSerializableException.class)public void testLambdaDirect() throws IOException, ClassNotFoundException {filter((String s) -> VALUE.length() > s.length(), "Bobby");}

稍作修改即可将值复制到有效的最终属性中,现在可以对lambda进行序列化并正确检索。

@Testpublic void testLambdaInDirect() throws IOException, ClassNotFoundException {String value = VALUE;filter((String s) -> value.length() > s.length(), "Bobby");}

当然,如果该值是一个简单的方法参数,它也可以正常工作。

@Testpublic void testLambdaParameter() throws IOException, ClassNotFoundException {invokeWithParameter(VALUE);}private void invokeWithParameter(String value) throws java.lang.ClassNotFoundException, java.io.IOException {filter((String s) -> value.length() > s.length(), "Bobby");}

因此答案是肯定的,如果您稍加注意,就可以将其序列化。

参考: Lambda,会序列化吗? 来自我们的JCG合作伙伴 Gerard Davison,来自Gerard Davison的博客博客。

翻译自: https://www.javacodegeeks.com/2013/12/lambda-will-it-serialize.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp日志泄漏漏洞_【Windows高危漏洞预警】CVE20200601,影响关键加密功能

一、事件报告2020年伊始&#xff0c;NSA发现了一个影响Microsoft Windows加密功能的严重漏洞(CVE-2020-0601)。证书验证漏洞允许攻击者破坏Windows验证加密信任的方式&#xff0c;并且可以启用远程代码执行。该漏洞会影响Windows 10和Windows Server 2016/2019以及依赖Windows的…

第一章计算机网络概述答案,第一章 计算机网络概述[3]

1-07 试在下列条件下比较电路交换和分组交换。要传送的报文共x(bit)。从源站到目的站共经过k段链路&#xff0c;每段链路的传播时延为d(s)&#xff0c;数据率为b(b/s)。在电路交换时电路的建立时间为S(s)。在分组交换时分组长度为p(bit)&#xff0c;且各结点的排队等待时间可忽…

meta标签的用处详解

meta标签的用处&#xff1a; 用来描述html文档的一个属性。列如作者。日期和时间&#xff0c;网页描述&#xff0c;关键字&#xff0c;页面刷新等。 是文档最基本的元数据 元数据&#xff08;metadata&#xff09;&#xff1a; 用来概括描述数据的一些基本数据 meta 标签的使用…

最小路径算法(Dijkstra算法和Floyd算法)

1.单源点的最短路径问题&#xff1a;给定带权有向图G和源点v&#xff0c;求从v到G中其余各顶点的最短路径。 我们用一个例子来具体说明迪杰斯特拉算法的流程。 定义源点为 0&#xff0c;dist[i]为源点 0 到顶点 i 的最短路径。其过程描述如下&#xff1a; 步骤dist[1]dist[2]di…

react如何监听路由url变化

"componentWillReceiveProps" "shouldComponentUpdate" "componentWillUpdate" "render" "componentDidUpdate" 使用这些生命周期钩子可以监听到路由相同&#xff0c;参数不同的变化&#xff0c;但是监听不到完全不相同的ur…

python 购物车程序_python_购物车程序

#需求1.启动程序后&#xff0c;让用户输入工资&#xff0c;然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后&#xff0c;检测余额是否够&#xff0c;够就直接扣款&#xff0c;不够就提醒 4.可随时退出&#xff0c;退出时&#xff0c;打印已购买商品和余额 #…

matlab tsai手眼标定程序代码_标定系列一 | 机器人手眼标定的基础理论分析

旷视MegMaster机器人系列是旷视自主研发的一系列AI智能机器人硬件设备&#xff0c;基于旷视全球领先的人工智能算法及机器人技术&#xff0c;可实现搬运、分拣、托举、存储等功能&#xff0c;被广泛应用于物流仓储、工厂制造等场景。旷视SLAM组主要负责多传感器建图、定位、标定…

Java8中的外观(JavaFX8)

JavaFX8在外观方面进行了一些更改 &#xff0c;其中最相关的是新CSS API &#xff0c;它允许您为控件以及已公开的Skin类创建新CSS属性和伪类。 使用CSS可以改变控件的很多外观&#xff0c;但是CSS只能实现很多功能&#xff0c;而这正是Skin类的用处。从“ UI控件体系结构”快…

600分理科选计算机专业,天津600分左右,计算机或电子信息专业,怎么选院校?...

原标题&#xff1a;天津600分左右&#xff0c;计算机或电子信息专业&#xff0c;怎么选院校&#xff1f;想学计算机或电子信息&#xff0c;一定是偏理选科对吧&#xff01;所谓的换算&#xff0c;是指的高考后出了全天津市不分文理的总排名后&#xff0c;如何换算成相当于天津市…

[TypeScript] Export public types from your library

If youre a library author, its useful to expose your public types as interfaces, to allow your consumers to extend them if needed. For example: To resolve the issues, we can do : // typings.d.tsinterface JQuery {hideChildren(): JQuery } 转载于:https://www.…

详解Asp.Net Core中的Cookies

目录 详解Asp.Net Core中的cookies搞懂cookiesAsp.Net中cookies的实现从http中获取cookies将cookies写入http中总结及感想详解Asp.Net Core中的cookies 搞懂cookies 我之前写过一篇文章来介绍cookies&#xff0c;如果你对cookies不是很了解请移步理解cookies这篇文章&#xff0…

为什么坚持使用JavaScript

由于JavaScript似乎征服了世界&#xff0c;因此与之相关的所有技术&#xff08;例如Node.js&#xff09;也开始兴起。 所有中间语言&#xff0c;包括TypeScript &#xff0c; CoffeeScript &#xff0c; ClojureScript和Google的Dart都已设定为目标&#xff0c;以使其更容易用J…

python tkinter选择路径控件_Python3 Tkinter选择路径功能的实现方法

效果基于Python3。 在自己写小工具的时候因为这个功能纠结了一会儿&#xff0c;这里写个小例子&#xff0c;供有需要的参考。 小例子&#xff0c;就是点击按钮打开路径选择窗口&#xff0c;选择后把值传给Entry输出。 效果预览 这是选择前&#xff1a;选择&#xff1a;选择后&a…

小程序在父组件执行子组件方法,可适用于下拉刷新上拉加载之后执行子组件方法

当父组件引用了子组件的时候&#xff0c;会遇到父组件执行子组件的方法&#xff0c;比如下拉刷新上拉加载等事件只有在页面中才能检测到&#xff0c;但是获取数据的方法在子组件&#xff0c;这时就可以执行子组件方法。 思路很简单&#xff0c;类似于vue中给子组件加ref执行子…

微型计算机接口与技术的交通灯,微机原理及接口技术课程设计交通灯

微机原理及接口技术课程设计交通灯序言十字道口的红绿灯是交通法规的无声命令&#xff0c;是司机和行人的行为准则。十字道口的交通红绿灯控制是保证交通安全和道路畅通的关键。当前&#xff0c;国内大多数城市正在采用“自动”红绿交通灯&#xff0c;它具有固定的“红灯—绿灯…

小米10pro使用说明书_华为Mate40、华为P40和小米10拍照对比:哪一款最好?

华为Mate 40 Pro、华为P40 Pro和小米10 Pro拍照对比&#xff1a;哪一款最好&#xff1f;华为Mate 40 Pro、小米10至尊纪念版、华为P40 Pro和小米10 Pro三款手机是在DxOMark上排名靠前的4部手机。而我们刚好拥有华为Mate 40 Pro、华为P40 Pro和小米10 Pro三款手机——作为同样搭…

xml和xml解析

1.简介XML XML 可扩展标记语言&#xff0c;传输数据 HTML超文本标记语言&#xff0c;显示数据 XML 文档声明 只能放在第一行&#xff0c;注释不能放在声明之前 <?xml version"1.0" encoding"UTF-8" standalone"no"?> standalone表示文…

JS中的同步异步问题

<script> /* * JS 是单线程 * 同步 异步 * 常见的异步 * 1、定时器 * 2、事件绑定 * 3、ajax请求&#xff08;一般的都是异步&#xff09; * 4、回调函数也可以理解成 异步 * */ var oDiv document.getElementById(div1); consol…

win8.1 计算机 桌面快捷方式,win8.1操作系统中我的电脑在哪里?win8.1我的电脑快捷键添加方法介绍...

很多刚刚接触win8的用户会发现&#xff0c;xp中的“我的电脑”&#xff0c;win7中的“计算机”&#xff0c;到了win8难道只有“资源管理器”了吗&#xff1f;开始菜单里边倒是有“计算机”&#xff0c;但是无法放到桌面。在最新版的win8.1中也是如此&#xff0c;大家会发现熟悉…

小程序修改数组中对象的某个值或者修改对象值

小程序中获取当前data定义的值&#xff0c;用this.data.xxx setData的时候要修改的值是不需要加this.data.xxx的&#xff0c;直接xxx, 一般直接修改data的值直接修改&#xff0c;修改数组中对象的值或者对象的属性值都要先转为字符串再加中括号&#xff0c;如果有变量可以用E…