Lambda,会序列化吗?
因此,我一直在思考Tyrus項(xiàng)目所需的增強(qiáng)功能,該功能允許用戶廣播到跨機(jī)器集群連接到URL的客戶端子集。 有多種方法可以做到這一點(diǎn); 但是自從我使用JDK 8以來(lái),這個(gè)問(wèn)題肯定看起來(lái)像釘子。
為此,我創(chuàng)建了一個(gè)簡(jiǎn)單的單元測(cè)試類,該類將使用我的過(guò)濾器,將其序列化到磁盤,讀回它,然后執(zhí)行它。 它有一個(gè)實(shí)例字段“ VALUE”,我們可以使用它直接或間接引用以找出導(dǎo)致序列化失敗的原因。
因此,為了進(jìn)行校準(zhǔn),請(qǐng)確保匿名內(nè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");}本地類也是如此,您不使用本地類嗎?
@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ú)立的類,在這種情況下,為方便起見(jiàn),可以使用嵌套類。
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非常滿意。
@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");} 因此答案是肯定的,如果您稍加注意,就可以將其序列化。
翻譯自: 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)題。
- 上一篇: 高分韩国悬疑电影(推荐八部超级好看的韩国
- 下一篇: 电脑的CPU为什么是金属(电脑cpu里面