当前位置: 首页 > 面试题库 >

创建lambda后对其进行序列化

舒博雅
2023-03-14
问题内容

我可以使用以下语法序列化lambda:

Runnable r = (Runnable & Serializable) () -> System.out.println("");
try (ObjectOutput oo = new ObjectOutputStream(new ByteArrayOutputStream())) {
  oo.writeObject(r);
}

但是,如果我从客户端代码接收到lambda,并且未正确进行转换,则无法序列化它。

如何r在不更改其定义的情况下在下面进行序列化:

Runnable r = () -> System.out.println("");

我试图序列化“派生”对象:

Runnable r1 = (Runnable & Serializable) r::run;
Runnable r2 = (Runnable & Serializable) () -> r.run();

但在每种情况下oo.writeObject(rxxx);均以失败NotSerializableException


问题答案:

这是正确的,并且是设计使然。就像无法获取不可序列化的对象并使其在实例化之后可序列化一样,一旦创建了lambda,则将设置其可序列化性。

如果lambda的目标类型是可序列化的(并且其捕获的参数是可序列化的),则可序列化。您的第一个示例是可序列化的,因为目标类型是交集(Runnable&Serializable)。您的两次转换尝试r均失败,因为在两种情况下r都是无法序列化的捕获变量,因此生成的lambda表达式/方法引用不可序列化。(绑定方法引用的接收者充当捕获的变量。)



 类似资料:
  • 我可以使用以下语法序列化lambda: 然而,如果我从客户机代码接收到lambda,并且它没有被适当地强制转换,我就无法序列化它。 如何在不更改其定义的情况下序列化下面的: 我尝试序列化一个“派生”对象: 但是在每种情况下,都失败,。

  • 问题内容: 我想知道,流(或收集器)中是否已经有一个已实现的功能,已将列表作为值进行了排序。例如,以下代码均产生按年龄分组的按性别分组的人员清单。第一个解决方案具有一些开销排序(看起来有些sc琐)。第二种解决方案需要对每个人进行两次检查,但是必须做到很好。 首先排序,然后分组为一个流: 首先分组,然后对每个值进行排序: 我只是想知道,是否已经实现了某项功能,该功能可以一次运行,例如。 问题答案:

  • 我想知道,流(或收集器)中是否已经实现了将列表排序为值的功能。例如,以下代码均生成按年龄排序的按性别分组的人员列表。第一个解决方案有一些开销排序(看起来有点邋遢)。第二种解决方案需要对每个人进行两次检查,但工作做得很好。 首先排序,然后在一个流中分组: 首先分组,然后对每个值进行排序: 我只是想知道,是否已经实现了一些东西,可以在一次运行中完成,比如。

  • 问题内容: 我有一个pandas数据框。我想按升序打印其列之一的唯一值。这就是我的做法: 问题是我得到了输出。 问题答案: 从iterable中返回一个新的排序列表。 码 输出值

  • 我有这个列表,我想按保留顺序订购,但我没有在自动完成辅助中找到任何函数 我也尝试过: 但是我有编译错误:

  • 我试图排序列的. csv文件。这些是列的名称和顺序: 这是我想要的订单: 当前我的代码如下所示: 使用我当前的代码,我得到以下列顺序的结果: 所以我已经想出了我必须传递一个函数给排序函数来指定我希望它如何排序,但是我找不到一个函数来做这件事。 非常感谢您的任何意见!