lambda 序列化_如何以及为什么要序列化Lambda

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

lambda 序列化

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

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

相关文章

python进行数据查询_如何进行python数据库查询?(实例解析)

在这篇文章之中我们来了解一下关于python数据库的相关知识&#xff0c;有些朋友可能是刚刚接触到python这一编程语言&#xff0c;对这一方面不是特别的了解&#xff0c;在接下来这篇文章将会来带大家来了解关于python查询数据库中数据的相关知识。 数据库的查询操作 Python查询…

【C语言】指针进阶第四站:数组/指针的传参问题!

点击蓝字关注我们朋友们&#xff0c;到站啦&#xff01;指针进阶第四站&#xff1a;传参问题0.引例自定义函数里形参的类型&#xff0c;要和函数调用中传过去的实参类型相对应test函数里的是int类型&#xff0c;我们传过去的参数a也是int类型void test(int n) {} int main() {i…

python做自动化控制postman_python自动化测试入门篇-postman

接口测试基础-postman 常用的接口有两种&#xff1a;webservice接口和http api接口。 Webservice接口是走soap协议通过http传输&#xff0c;请求报文和返回报文都是xml格式。 http api接口是走http协议&#xff0c;通过路径来区分调用的方法&#xff0c;请求报文都是key-value形…

Python3实现红黑树[上篇]

Python3实现红黑树[上篇]由于时间有限&#xff0c;这次只写了红黑树添加节点&#xff0c;关于节点的删除放在下一讲 https://blog.csdn.net/qq_18138105/article/details/105324025。 关于红黑树的介绍&#xff0c;来由&#xff0c;性质和定义&#xff0c;可以看这篇文章&…

web应用程序并发测试_测试并发应用

web应用程序并发测试本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01; 目录…

深入理解存储器层次结构

点击蓝字关注我们1概述对于一个简单的计算机系统模型&#xff0c;我们可以将存储器系统看做是一个线性的字节数组&#xff0c;而 CPU 能够在一个常数时间内访问每个存储器的位置。实际上&#xff0c;存储器系统&#xff08;memory system&#xff09;是一个具有不同容量、成本和…

python中可选参数是什么意思_Python如何定义有可选参数的元类

问题 你想定义一个元类&#xff0c;允许类定义时提供可选参数&#xff0c;这样可以控制或配置类型的创建过程。 解决方案 在定义类的时候&#xff0c;Python允许我们使用 metaclass关键字参数来指定特定的元类。 例如使用抽象基类&#xff1a; from abc import ABCMeta, abstra…

C++的一个指针占内存几个字节?

C的一个指针占内存几个字节&#xff1f;结论&#xff1a; 取决于是64位编译模式还是32位编译模式&#xff08;注意&#xff0c;和机器位数没有直接关系&#xff09; 在64位编译模式下&#xff0c;指针的占用内存大小是8字节在32位编译模式下&#xff0c;指针占用内存大小是4字…

jmc线程转储_使线程转储智能化

jmc线程转储很久以前&#xff0c;我了解了一个称为Log MDC的东西&#xff0c;我对此非常感兴趣。 我突然意识到日志文件中发生的一切&#xff0c;并指出了特定的日志条目&#xff0c;并找到了对错&#xff0c;特别是在调试生产中的错误时。 2013年&#xff0c;我受委托从事一个…

【C语言】指针进阶第五站:函数指针!

点击蓝字关注我们函数指针函数也有自己的地址&#xff0c;函数名/&函数名 就是函数的地址1.1基本形式在 数组指针的学习中我们了解到int arr[5]; int (*pa)[5] &arr;//pa是数组指针指针变量pa的类型是int(*)[5]那么函数指针的形式是怎样的呢&#xff1f;void test(cha…

jsp 体检信息查询 绕过用户名验证_一篇彻底搞懂jsp

jsp 实栗 jsp jdbc 实现登录实现思路一个表单页&#xff0c;输入用户登录和密码&#xff0c;然后信息提交到jsp页面进行验证&#xff0c;如果可以服务器跳转到登录成功页&#xff0c;失败&#xff0c;跳转到错误页跳转的时候窗口的URL地址会发生变化代码如下编写登录代码登录&…

Python3求解找到小镇的法官问题

Python3求解找到小镇的法官问题原题 https://leetcode-cn.com/problems/find-the-town-judge/题目&#xff1a; 在一个小镇里&#xff0c;按从 1 到 N 标记了 N 个人。传言称&#xff0c;这些人中有一个是小镇上的秘密法官。 如果小镇的法官真的存在&#xff0c;那么&#xff…

couchbase_具有Rx-Java的Couchbase Java SDK

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

C/C++与汇编混合编程有什么好处?

点击蓝字关注我们1 导语 当需要C/C与汇编混合编程时&#xff0c;可以有以下两种处理策略&#xff1a;若汇编代码较短&#xff0c;则可在C/C源文件中直接内嵌汇编语言实现混合编程。若汇编代码较长&#xff0c;可以单独写成汇编文件&#xff0c;最后以汇编文件的形式加入项目中&…

centos 7.6安装java_Hadoop的安装

为了方便后面使用Hadoop的shell命令&#xff0c;我先介绍Hadoop的安装。Hadoop有多种安装模式&#xff0c;这里介绍伪分布式的安装。我测试过Ubutun、Centos和WSL&#xff0c;都可以正常安装Hadoop的所有版本。所有一般不会出现版本对应的问题。Hadoop是基于Java语言进行编写的…

Python3 解题:字符串压缩

Python3 解题&#xff1a;字符串压缩原题 https://leetcode-cn.com/problems/compress-string-lcci/题目&#xff1a; 字符串压缩。利用字符重复出现的次数&#xff0c;编写一种方法&#xff0c;实现基本的字符串压缩功能。比如&#xff0c;字符串aabcccccaaa会变为a2b1c5a3。若…

C++软件分析师异常分析工作经验汇总

点击蓝字关注我们最近几年工作当中很大一部分内容是排查软件运行过程中遇到的各种异常&#xff0c;积累了一定的经验&#xff0c;在此给大家分享一下。本文将详细讲述Windows系统中软件异常的分类以及常用的排查方法&#xff0c;给大家提供一个借鉴与参考。1、软件异常的分类常…

java fix_Java中的低延迟FIX引擎

java fix总览 Chronicle FIX是我们的Low Latency FIX引擎和Java数据库。 是什么使它与众不同&#xff1f; 是为Java中的超低GC *设计的。 支持字符串和日期时间的方式可以最大程度地减少垃圾和开销。 可自定义为仅包含您期望的字段。 使用通常在二进制解析器和生成器中使用…

linux 查看防火墙状态_每天五分钟学习Linux系列之 - 系统安全配置

20年IT从业&#xff0c;二哥的团队使用最多的系统就是Linux&#xff0c;开发&#xff0c;运维的小伙伴们都离不开Linux系统&#xff0c;特别是大数据和人工智能领域更是如此&#xff0c;但由于日常工作忙&#xff0c;小伙伴们没有太多成块的时间系统的学习Linux, 并且现版CentO…

Python3求解旋转矩阵问题

Python3求解旋转矩阵问题原题 https://leetcode-cn.com/problems/spiral-matrix/ 给定一个包含 m x n 个元素的矩阵&#xff08;m 行, n 列&#xff09;&#xff0c;请按照顺时针螺旋顺序&#xff0c;返回矩阵中的所有元素。 示例 1: 输入: [[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8…