日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Lambda,会序列化吗?

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lambda,会序列化吗? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

因此,我一直在思考Tyrus項(xiàng)目所需的增強(qiáng)功能,該功能允許用戶(hù)廣播到跨機(jī)器集群連接到URL的客戶(hù)端子集。 有多種方法可以做到這一點(diǎn); 但是自從我使用JDK 8以來(lái),這個(gè)問(wèn)題肯定看起來(lái)像釘子。


為此,我創(chuàng)建了一個(gè)簡(jiǎn)單的單元測(cè)試類(lèi),該類(lèi)將使用我的過(guò)濾器,將其序列化到磁盤(pán),讀回它,然后執(zhí)行它。 它有一個(gè)實(shí)例字段“ VALUE”,我們可以使用它直接或間接引用以找出導(dǎo)致序列化失敗的原因。

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));}}}

因此,為了進(jìn)行校準(zhǔn),請(qǐng)確保匿名內(nèi)部類(lèi)將失敗,因?yàn)樗冀K包含對(duì)封閉對(duì)象的引用……。

@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");}

本地類(lèi)也是如此,您不使用本地類(lèi)嗎?

@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");}

因此,當(dāng)然可以使用獨(dú)立的類(lèi),在這種情況下,為方便起見(jiàn),可以使用嵌套類(lèi)。

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");}

因此,讓我們開(kāi)始使用JDK 8,事實(shí)證明,我的第一次嘗試也失敗了,但它確實(shí)確認(rèn)序列化對(duì)于使用Lambda非常滿(mǎn)意。

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

稍作修改即可將值復(fù)制到有效的最終屬性中,現(xiàn)在可以對(duì)lambda進(jìn)行序列化并正確檢索。

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

當(dāng)然,如果該值是一個(gè)簡(jiǎn)單的方法參數(shù),它也可以正常工作。

@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,會(huì)序列化嗎? 來(lái)自我們的JCG合作伙伴 Gerard Davison,來(lái)自Gerard Davison的博客博客。

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Lambda,会序列化吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。