twiceyuan
10/12/2016 - 8:20 AM

Java 8 serializable lambda pitfall example, https://www.zhihu.com/question/51491241

Java 8 serializable lambda pitfall example, https://www.zhihu.com/question/51491241

$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
$ javac -cp .:/tmp/spark-2.0.1-bin-hadoop2.7/jars/spark-core_2.11-2.0.1.jar -g Demo.java
$ java -Djdk.internal.lambda.dumpProxyClasses=. -cp .:/tmp/spark-2.0.1-bin-hadoop2.7/jars/spark-core_2.11-2.0.1.jar Demo
true
true
true
c1 serialization succeeded
c2 serialization failed
java.io.NotSerializableException: java.io.PrintStream
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at Demo.main(Demo.java:34)
c3 serialization failed
java.io.NotSerializableException: java.io.PrintStream
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at Demo.main(Demo.java:46)
$ javap -verbose -c -s -l -private Demo
Classfile /private/tmp/Demo.class
  Last modified Oct 12, 2016; size 4038 bytes
  MD5 checksum 7152bad1cf7efc23680b2b45f1535f6a
  Compiled from "Demo.java"
public class Demo
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
    #1 = Methodref          #49.#97       // java/lang/Object."<init>":()V
    #2 = InvokeDynamic      #0:#105       // #0:call:()Lorg/apache/spark/api/java/function/VoidFunction;
    #3 = Fieldref           #106.#107     // java/lang/System.out:Ljava/io/PrintStream;
    #4 = Methodref          #49.#108      // java/lang/Object.getClass:()Ljava/lang/Class;
    #5 = InvokeDynamic      #1:#110       // #1:call:(Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
    #6 = InvokeDynamic      #2:#110       // #2:call:(Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
    #7 = Class              #112          // java/io/Serializable
    #8 = Methodref          #42.#113      // java/io/PrintStream.println:(Z)V
    #9 = Class              #114          // java/io/ByteArrayOutputStream
   #10 = Methodref          #9.#97        // java/io/ByteArrayOutputStream."<init>":()V
   #11 = Class              #115          // java/io/ObjectOutputStream
   #12 = Methodref          #11.#116      // java/io/ObjectOutputStream."<init>":(Ljava/io/OutputStream;)V
   #13 = Methodref          #11.#117      // java/io/ObjectOutputStream.writeObject:(Ljava/lang/Object;)V
   #14 = Class              #118          // java/lang/Exception
   #15 = String             #119          // c1 serialization failed
   #16 = Methodref          #42.#120      // java/io/PrintStream.println:(Ljava/lang/String;)V
   #17 = Methodref          #14.#121      // java/lang/Exception.printStackTrace:(Ljava/io/PrintStream;)V
   #18 = String             #122          // c1 serialization succeeded
   #19 = String             #123          // c2 serialization failed
   #20 = String             #124          // c2 serialization succeeded
   #21 = String             #125          // c3 serialization failed
   #22 = String             #126          // c3 serialization succeeded
   #23 = Methodref          #127.#128     // java/lang/invoke/SerializedLambda.getImplMethodName:()Ljava/lang/String;
   #24 = Methodref          #129.#130     // java/lang/String.hashCode:()I
   #25 = String             #131          // println
   #26 = Methodref          #129.#132     // java/lang/String.equals:(Ljava/lang/Object;)Z
   #27 = String             #89           // lambda$main$871ceed3$1
   #28 = String             #93           // lambda$main$28d50090$1
   #29 = Methodref          #127.#133     // java/lang/invoke/SerializedLambda.getImplMethodKind:()I
   #30 = Methodref          #127.#134     // java/lang/invoke/SerializedLambda.getFunctionalInterfaceClass:()Ljava/lang/String;
   #31 = String             #135          // org/apache/spark/api/java/function/VoidFunction
   #32 = Methodref          #49.#132      // java/lang/Object.equals:(Ljava/lang/Object;)Z
   #33 = Methodref          #127.#136     // java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodName:()Ljava/lang/String;
   #34 = String             #137          // call
   #35 = Methodref          #127.#138     // java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodSignature:()Ljava/lang/String;
   #36 = String             #139          // (Ljava/lang/Object;)V
   #37 = Methodref          #127.#140     // java/lang/invoke/SerializedLambda.getImplClass:()Ljava/lang/String;
   #38 = String             #141          // java/io/PrintStream
   #39 = Methodref          #127.#142     // java/lang/invoke/SerializedLambda.getImplMethodSignature:()Ljava/lang/String;
   #40 = String             #94           // (Ljava/lang/String;)V
   #41 = Methodref          #127.#143     // java/lang/invoke/SerializedLambda.getCapturedArg:(I)Ljava/lang/Object;
   #42 = Class              #141          // java/io/PrintStream
   #43 = String             #144          // Demo
   #44 = String             #90           // (Ljava/io/PrintStream;Ljava/lang/String;)V
   #45 = Class              #145          // java/lang/IllegalArgumentException
   #46 = String             #146          // Invalid lambda deserialization
   #47 = Methodref          #45.#147      // java/lang/IllegalArgumentException."<init>":(Ljava/lang/String;)V
   #48 = Class              #144          // Demo
   #49 = Class              #148          // java/lang/Object
   #50 = Utf8               <init>
   #51 = Utf8               ()V
   #52 = Utf8               Code
   #53 = Utf8               LineNumberTable
   #54 = Utf8               LocalVariableTable
   #55 = Utf8               this
   #56 = Utf8               LDemo;
   #57 = Utf8               main
   #58 = Utf8               ([Ljava/lang/String;)V
   #59 = Utf8               out
   #60 = Utf8               Ljava/io/ObjectOutputStream;
   #61 = Utf8               e
   #62 = Utf8               Ljava/lang/Exception;
   #63 = Utf8               args
   #64 = Utf8               [Ljava/lang/String;
   #65 = Utf8               c1
   #66 = Utf8               Lorg/apache/spark/api/java/function/VoidFunction;
   #67 = Utf8               c2
   #68 = Utf8               sysout
   #69 = Utf8               Ljava/io/PrintStream;
   #70 = Utf8               c3
   #71 = Utf8               bos
   #72 = Utf8               Ljava/io/ByteArrayOutputStream;
   #73 = Utf8               success
   #74 = Utf8               Z
   #75 = Utf8               LocalVariableTypeTable
   #76 = Utf8               Lorg/apache/spark/api/java/function/VoidFunction<Ljava/lang/String;>;
   #77 = Utf8               StackMapTable
   #78 = Class              #64           // "[Ljava/lang/String;"
   #79 = Class              #135          // org/apache/spark/api/java/function/VoidFunction
   #80 = Class              #141          // java/io/PrintStream
   #81 = Class              #114          // java/io/ByteArrayOutputStream
   #82 = Class              #118          // java/lang/Exception
   #83 = Utf8               Exceptions
   #84 = Utf8               $deserializeLambda$
   #85 = Utf8               (Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;
   #86 = Utf8               lambda
   #87 = Utf8               Ljava/lang/invoke/SerializedLambda;
   #88 = Class              #149          // java/lang/String
   #89 = Utf8               lambda$main$871ceed3$1
   #90 = Utf8               (Ljava/io/PrintStream;Ljava/lang/String;)V
   #91 = Utf8               s
   #92 = Utf8               Ljava/lang/String;
   #93 = Utf8               lambda$main$28d50090$1
   #94 = Utf8               (Ljava/lang/String;)V
   #95 = Utf8               SourceFile
   #96 = Utf8               Demo.java
   #97 = NameAndType        #50:#51       // "<init>":()V
   #98 = Utf8               BootstrapMethods
   #99 = MethodHandle       #6:#150       // invokestatic java/lang/invoke/LambdaMetafactory.altMetafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #100 = MethodType         #139          //  (Ljava/lang/Object;)V
  #101 = MethodHandle       #6:#151       // invokestatic Demo.lambda$main$28d50090$1:(Ljava/lang/String;)V
  #102 = MethodType         #94           //  (Ljava/lang/String;)V
  #103 = Integer            5
  #104 = Integer            0
  #105 = NameAndType        #137:#152     // call:()Lorg/apache/spark/api/java/function/VoidFunction;
  #106 = Class              #153          // java/lang/System
  #107 = NameAndType        #59:#69       // out:Ljava/io/PrintStream;
  #108 = NameAndType        #154:#155     // getClass:()Ljava/lang/Class;
  #109 = MethodHandle       #5:#16        // invokevirtual java/io/PrintStream.println:(Ljava/lang/String;)V
  #110 = NameAndType        #137:#156     // call:(Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
  #111 = MethodHandle       #6:#157       // invokestatic Demo.lambda$main$871ceed3$1:(Ljava/io/PrintStream;Ljava/lang/String;)V
  #112 = Utf8               java/io/Serializable
  #113 = NameAndType        #131:#158     // println:(Z)V
  #114 = Utf8               java/io/ByteArrayOutputStream
  #115 = Utf8               java/io/ObjectOutputStream
  #116 = NameAndType        #50:#159      // "<init>":(Ljava/io/OutputStream;)V
  #117 = NameAndType        #160:#139     // writeObject:(Ljava/lang/Object;)V
  #118 = Utf8               java/lang/Exception
  #119 = Utf8               c1 serialization failed
  #120 = NameAndType        #131:#94      // println:(Ljava/lang/String;)V
  #121 = NameAndType        #161:#162     // printStackTrace:(Ljava/io/PrintStream;)V
  #122 = Utf8               c1 serialization succeeded
  #123 = Utf8               c2 serialization failed
  #124 = Utf8               c2 serialization succeeded
  #125 = Utf8               c3 serialization failed
  #126 = Utf8               c3 serialization succeeded
  #127 = Class              #163          // java/lang/invoke/SerializedLambda
  #128 = NameAndType        #164:#165     // getImplMethodName:()Ljava/lang/String;
  #129 = Class              #149          // java/lang/String
  #130 = NameAndType        #166:#167     // hashCode:()I
  #131 = Utf8               println
  #132 = NameAndType        #168:#169     // equals:(Ljava/lang/Object;)Z
  #133 = NameAndType        #170:#167     // getImplMethodKind:()I
  #134 = NameAndType        #171:#165     // getFunctionalInterfaceClass:()Ljava/lang/String;
  #135 = Utf8               org/apache/spark/api/java/function/VoidFunction
  #136 = NameAndType        #172:#165     // getFunctionalInterfaceMethodName:()Ljava/lang/String;
  #137 = Utf8               call
  #138 = NameAndType        #173:#165     // getFunctionalInterfaceMethodSignature:()Ljava/lang/String;
  #139 = Utf8               (Ljava/lang/Object;)V
  #140 = NameAndType        #174:#165     // getImplClass:()Ljava/lang/String;
  #141 = Utf8               java/io/PrintStream
  #142 = NameAndType        #175:#165     // getImplMethodSignature:()Ljava/lang/String;
  #143 = NameAndType        #176:#177     // getCapturedArg:(I)Ljava/lang/Object;
  #144 = Utf8               Demo
  #145 = Utf8               java/lang/IllegalArgumentException
  #146 = Utf8               Invalid lambda deserialization
  #147 = NameAndType        #50:#94       // "<init>":(Ljava/lang/String;)V
  #148 = Utf8               java/lang/Object
  #149 = Utf8               java/lang/String
  #150 = Methodref          #178.#179     // java/lang/invoke/LambdaMetafactory.altMetafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #151 = Methodref          #48.#180      // Demo.lambda$main$28d50090$1:(Ljava/lang/String;)V
  #152 = Utf8               ()Lorg/apache/spark/api/java/function/VoidFunction;
  #153 = Utf8               java/lang/System
  #154 = Utf8               getClass
  #155 = Utf8               ()Ljava/lang/Class;
  #156 = Utf8               (Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
  #157 = Methodref          #48.#181      // Demo.lambda$main$871ceed3$1:(Ljava/io/PrintStream;Ljava/lang/String;)V
  #158 = Utf8               (Z)V
  #159 = Utf8               (Ljava/io/OutputStream;)V
  #160 = Utf8               writeObject
  #161 = Utf8               printStackTrace
  #162 = Utf8               (Ljava/io/PrintStream;)V
  #163 = Utf8               java/lang/invoke/SerializedLambda
  #164 = Utf8               getImplMethodName
  #165 = Utf8               ()Ljava/lang/String;
  #166 = Utf8               hashCode
  #167 = Utf8               ()I
  #168 = Utf8               equals
  #169 = Utf8               (Ljava/lang/Object;)Z
  #170 = Utf8               getImplMethodKind
  #171 = Utf8               getFunctionalInterfaceClass
  #172 = Utf8               getFunctionalInterfaceMethodName
  #173 = Utf8               getFunctionalInterfaceMethodSignature
  #174 = Utf8               getImplClass
  #175 = Utf8               getImplMethodSignature
  #176 = Utf8               getCapturedArg
  #177 = Utf8               (I)Ljava/lang/Object;
  #178 = Class              #182          // java/lang/invoke/LambdaMetafactory
  #179 = NameAndType        #183:#187     // altMetafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #180 = NameAndType        #93:#94       // lambda$main$28d50090$1:(Ljava/lang/String;)V
  #181 = NameAndType        #89:#90       // lambda$main$871ceed3$1:(Ljava/io/PrintStream;Ljava/lang/String;)V
  #182 = Utf8               java/lang/invoke/LambdaMetafactory
  #183 = Utf8               altMetafactory
  #184 = Class              #189          // java/lang/invoke/MethodHandles$Lookup
  #185 = Utf8               Lookup
  #186 = Utf8               InnerClasses
  #187 = Utf8               (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #188 = Class              #190          // java/lang/invoke/MethodHandles
  #189 = Utf8               java/lang/invoke/MethodHandles$Lookup
  #190 = Utf8               java/lang/invoke/MethodHandles
{
  public Demo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 4: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   LDemo;

  public static void main(java.lang.String[]) throws java.lang.Exception;
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=8, args_size=1
         0: invokedynamic #2,  0              // InvokeDynamic #0:call:()Lorg/apache/spark/api/java/function/VoidFunction;
         5: astore_1
         6: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         9: dup
        10: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
        13: pop
        14: invokedynamic #5,  0              // InvokeDynamic #1:call:(Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
        19: astore_2
        20: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        23: astore_3
        24: aload_3
        25: invokedynamic #6,  0              // InvokeDynamic #2:call:(Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
        30: astore        4
        32: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        35: aload_1
        36: instanceof    #7                  // class java/io/Serializable
        39: invokevirtual #8                  // Method java/io/PrintStream.println:(Z)V
        42: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        45: aload_2
        46: instanceof    #7                  // class java/io/Serializable
        49: invokevirtual #8                  // Method java/io/PrintStream.println:(Z)V
        52: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        55: aload         4
        57: instanceof    #7                  // class java/io/Serializable
        60: invokevirtual #8                  // Method java/io/PrintStream.println:(Z)V
        63: new           #9                  // class java/io/ByteArrayOutputStream
        66: dup
        67: invokespecial #10                 // Method java/io/ByteArrayOutputStream."<init>":()V
        70: astore        5
        72: iconst_0
        73: istore        6
        75: new           #11                 // class java/io/ObjectOutputStream
        78: dup
        79: aload         5
        81: invokespecial #12                 // Method java/io/ObjectOutputStream."<init>":(Ljava/io/OutputStream;)V
        84: astore        7
        86: aload         7
        88: aload_1
        89: invokevirtual #13                 // Method java/io/ObjectOutputStream.writeObject:(Ljava/lang/Object;)V
        92: iconst_1
        93: istore        6
        95: goto          116
        98: astore        7
       100: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       103: ldc           #15                 // String c1 serialization failed
       105: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       108: aload         7
       110: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       113: invokevirtual #17                 // Method java/lang/Exception.printStackTrace:(Ljava/io/PrintStream;)V
       116: iload         6
       118: ifeq          129
       121: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       124: ldc           #18                 // String c1 serialization succeeded
       126: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       129: iconst_0
       130: istore        6
       132: new           #11                 // class java/io/ObjectOutputStream
       135: dup
       136: aload         5
       138: invokespecial #12                 // Method java/io/ObjectOutputStream."<init>":(Ljava/io/OutputStream;)V
       141: astore        7
       143: aload         7
       145: aload_2
       146: invokevirtual #13                 // Method java/io/ObjectOutputStream.writeObject:(Ljava/lang/Object;)V
       149: iconst_1
       150: istore        6
       152: goto          173
       155: astore        7
       157: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       160: ldc           #19                 // String c2 serialization failed
       162: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       165: aload         7
       167: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       170: invokevirtual #17                 // Method java/lang/Exception.printStackTrace:(Ljava/io/PrintStream;)V
       173: iload         6
       175: ifeq          186
       178: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       181: ldc           #20                 // String c2 serialization succeeded
       183: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       186: iconst_0
       187: istore        6
       189: new           #11                 // class java/io/ObjectOutputStream
       192: dup
       193: aload         5
       195: invokespecial #12                 // Method java/io/ObjectOutputStream."<init>":(Ljava/io/OutputStream;)V
       198: astore        7
       200: aload         7
       202: aload         4
       204: invokevirtual #13                 // Method java/io/ObjectOutputStream.writeObject:(Ljava/lang/Object;)V
       207: iconst_1
       208: istore        6
       210: goto          231
       213: astore        7
       215: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       218: ldc           #21                 // String c3 serialization failed
       220: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       223: aload         7
       225: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       228: invokevirtual #17                 // Method java/lang/Exception.printStackTrace:(Ljava/io/PrintStream;)V
       231: iload         6
       233: ifeq          244
       236: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       239: ldc           #22                 // String c3 serialization succeeded
       241: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       244: return
      Exception table:
         from    to  target type
            75    95    98   Class java/lang/Exception
           132   152   155   Class java/lang/Exception
           189   210   213   Class java/lang/Exception
      LineNumberTable:
        line 6: 0
        line 7: 6
        line 8: 20
        line 9: 24
        line 12: 32
        line 13: 42
        line 14: 52
        line 16: 63
        line 19: 72
        line 21: 75
        line 22: 86
        line 23: 92
        line 27: 95
        line 24: 98
        line 25: 100
        line 26: 108
        line 28: 116
        line 31: 129
        line 33: 132
        line 34: 143
        line 35: 149
        line 39: 152
        line 36: 155
        line 37: 157
        line 38: 165
        line 40: 173
        line 43: 186
        line 45: 189
        line 46: 200
        line 47: 207
        line 51: 210
        line 48: 213
        line 49: 215
        line 50: 223
        line 52: 231
        line 53: 244
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
           86       9     7   out   Ljava/io/ObjectOutputStream;
          100      16     7     e   Ljava/lang/Exception;
          143       9     7   out   Ljava/io/ObjectOutputStream;
          157      16     7     e   Ljava/lang/Exception;
          200      10     7   out   Ljava/io/ObjectOutputStream;
          215      16     7     e   Ljava/lang/Exception;
            0     245     0  args   [Ljava/lang/String;
            6     239     1    c1   Lorg/apache/spark/api/java/function/VoidFunction;
           20     225     2    c2   Lorg/apache/spark/api/java/function/VoidFunction;
           24     221     3 sysout   Ljava/io/PrintStream;
           32     213     4    c3   Lorg/apache/spark/api/java/function/VoidFunction;
           72     173     5   bos   Ljava/io/ByteArrayOutputStream;
           75     170     6 success   Z
      LocalVariableTypeTable:
        Start  Length  Slot  Name   Signature
            6     239     1    c1   Lorg/apache/spark/api/java/function/VoidFunction<Ljava/lang/String;>;
           20     225     2    c2   Lorg/apache/spark/api/java/function/VoidFunction<Ljava/lang/String;>;
           32     213     4    c3   Lorg/apache/spark/api/java/function/VoidFunction<Ljava/lang/String;>;
      StackMapTable: number_of_entries = 9
        frame_type = 255 /* full_frame */
          offset_delta = 98
          locals = [ class "[Ljava/lang/String;", class org/apache/spark/api/java/function/VoidFunction, class org/apache/spark/api/java/function/VoidFunction, class java/io/PrintStream, class org/apache/spark/api/java/function/VoidFunction, class java/io/ByteArrayOutputStream, int ]
          stack = [ class java/lang/Exception ]
        frame_type = 17 /* same */
        frame_type = 12 /* same */
        frame_type = 89 /* same_locals_1_stack_item */
          stack = [ class java/lang/Exception ]
        frame_type = 17 /* same */
        frame_type = 12 /* same */
        frame_type = 90 /* same_locals_1_stack_item */
          stack = [ class java/lang/Exception ]
        frame_type = 17 /* same */
        frame_type = 12 /* same */
    Exceptions:
      throws java.lang.Exception

  private static java.lang.Object $deserializeLambda$(java.lang.invoke.SerializedLambda);
    descriptor: (Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;
    flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
    Code:
      stack=3, locals=3, args_size=1
         0: aload_0
         1: invokevirtual #23                 // Method java/lang/invoke/SerializedLambda.getImplMethodName:()Ljava/lang/String;
         4: astore_1
         5: iconst_m1
         6: istore_2
         7: aload_1
         8: invokevirtual #24                 // Method java/lang/String.hashCode:()I
        11: lookupswitch  { // 3
              -559453015: 72
              -314717969: 44
               822978427: 58
                 default: 83
            }
        44: aload_1
        45: ldc           #25                 // String println
        47: invokevirtual #26                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
        50: ifeq          83
        53: iconst_0
        54: istore_2
        55: goto          83
        58: aload_1
        59: ldc           #27                 // String lambda$main$871ceed3$1
        61: invokevirtual #26                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
        64: ifeq          83
        67: iconst_1
        68: istore_2
        69: goto          83
        72: aload_1
        73: ldc           #28                 // String lambda$main$28d50090$1
        75: invokevirtual #26                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
        78: ifeq          83
        81: iconst_2
        82: istore_2
        83: iload_2
        84: tableswitch   { // 0 to 2
                       0: 112
                       1: 194
                       2: 277
                 default: 352
            }
       112: aload_0
       113: invokevirtual #29                 // Method java/lang/invoke/SerializedLambda.getImplMethodKind:()I
       116: iconst_5
       117: if_icmpne     352
       120: aload_0
       121: invokevirtual #30                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceClass:()Ljava/lang/String;
       124: ldc           #31                 // String org/apache/spark/api/java/function/VoidFunction
       126: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       129: ifeq          352
       132: aload_0
       133: invokevirtual #33                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodName:()Ljava/lang/String;
       136: ldc           #34                 // String call
       138: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       141: ifeq          352
       144: aload_0
       145: invokevirtual #35                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodSignature:()Ljava/lang/String;
       148: ldc           #36                 // String (Ljava/lang/Object;)V
       150: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       153: ifeq          352
       156: aload_0
       157: invokevirtual #37                 // Method java/lang/invoke/SerializedLambda.getImplClass:()Ljava/lang/String;
       160: ldc           #38                 // String java/io/PrintStream
       162: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       165: ifeq          352
       168: aload_0
       169: invokevirtual #39                 // Method java/lang/invoke/SerializedLambda.getImplMethodSignature:()Ljava/lang/String;
       172: ldc           #40                 // String (Ljava/lang/String;)V
       174: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       177: ifeq          352
       180: aload_0
       181: iconst_0
       182: invokevirtual #41                 // Method java/lang/invoke/SerializedLambda.getCapturedArg:(I)Ljava/lang/Object;
       185: checkcast     #42                 // class java/io/PrintStream
       188: invokedynamic #5,  0              // InvokeDynamic #1:call:(Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
       193: areturn
       194: aload_0
       195: invokevirtual #29                 // Method java/lang/invoke/SerializedLambda.getImplMethodKind:()I
       198: bipush        6
       200: if_icmpne     352
       203: aload_0
       204: invokevirtual #30                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceClass:()Ljava/lang/String;
       207: ldc           #31                 // String org/apache/spark/api/java/function/VoidFunction
       209: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       212: ifeq          352
       215: aload_0
       216: invokevirtual #33                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodName:()Ljava/lang/String;
       219: ldc           #34                 // String call
       221: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       224: ifeq          352
       227: aload_0
       228: invokevirtual #35                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodSignature:()Ljava/lang/String;
       231: ldc           #36                 // String (Ljava/lang/Object;)V
       233: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       236: ifeq          352
       239: aload_0
       240: invokevirtual #37                 // Method java/lang/invoke/SerializedLambda.getImplClass:()Ljava/lang/String;
       243: ldc           #43                 // String Demo
       245: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       248: ifeq          352
       251: aload_0
       252: invokevirtual #39                 // Method java/lang/invoke/SerializedLambda.getImplMethodSignature:()Ljava/lang/String;
       255: ldc           #44                 // String (Ljava/io/PrintStream;Ljava/lang/String;)V
       257: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       260: ifeq          352
       263: aload_0
       264: iconst_0
       265: invokevirtual #41                 // Method java/lang/invoke/SerializedLambda.getCapturedArg:(I)Ljava/lang/Object;
       268: checkcast     #42                 // class java/io/PrintStream
       271: invokedynamic #6,  0              // InvokeDynamic #2:call:(Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
       276: areturn
       277: aload_0
       278: invokevirtual #29                 // Method java/lang/invoke/SerializedLambda.getImplMethodKind:()I
       281: bipush        6
       283: if_icmpne     352
       286: aload_0
       287: invokevirtual #30                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceClass:()Ljava/lang/String;
       290: ldc           #31                 // String org/apache/spark/api/java/function/VoidFunction
       292: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       295: ifeq          352
       298: aload_0
       299: invokevirtual #33                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodName:()Ljava/lang/String;
       302: ldc           #34                 // String call
       304: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       307: ifeq          352
       310: aload_0
       311: invokevirtual #35                 // Method java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodSignature:()Ljava/lang/String;
       314: ldc           #36                 // String (Ljava/lang/Object;)V
       316: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       319: ifeq          352
       322: aload_0
       323: invokevirtual #37                 // Method java/lang/invoke/SerializedLambda.getImplClass:()Ljava/lang/String;
       326: ldc           #43                 // String Demo
       328: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       331: ifeq          352
       334: aload_0
       335: invokevirtual #39                 // Method java/lang/invoke/SerializedLambda.getImplMethodSignature:()Ljava/lang/String;
       338: ldc           #40                 // String (Ljava/lang/String;)V
       340: invokevirtual #32                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
       343: ifeq          352
       346: invokedynamic #2,  0              // InvokeDynamic #0:call:()Lorg/apache/spark/api/java/function/VoidFunction;
       351: areturn
       352: new           #45                 // class java/lang/IllegalArgumentException
       355: dup
       356: ldc           #46                 // String Invalid lambda deserialization
       358: invokespecial #47                 // Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/String;)V
       361: athrow
      LineNumberTable:
        line 4: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0     362     0 lambda   Ljava/lang/invoke/SerializedLambda;
      StackMapTable: number_of_entries = 8
        frame_type = 253 /* append */
          offset_delta = 44
          locals = [ class java/lang/String, int ]
        frame_type = 13 /* same */
        frame_type = 13 /* same */
        frame_type = 10 /* same */
        frame_type = 28 /* same */
        frame_type = 251 /* same_frame_extended */
          offset_delta = 81
        frame_type = 251 /* same_frame_extended */
          offset_delta = 82
        frame_type = 249 /* chop */
          offset_delta = 74

  private static void lambda$main$871ceed3$1(java.io.PrintStream, java.lang.String) throws java.lang.Exception;
    descriptor: (Ljava/io/PrintStream;Ljava/lang/String;)V
    flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         5: return
      LineNumberTable:
        line 9: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0 sysout   Ljava/io/PrintStream;
            0       6     1     s   Ljava/lang/String;
    Exceptions:
      throws java.lang.Exception

  private static void lambda$main$28d50090$1(java.lang.String) throws java.lang.Exception;
    descriptor: (Ljava/lang/String;)V
    flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: aload_0
         4: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         7: return
      LineNumberTable:
        line 6: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       8     0     s   Ljava/lang/String;
    Exceptions:
      throws java.lang.Exception
}
SourceFile: "Demo.java"
InnerClasses:
     public static final #185= #184 of #188; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
BootstrapMethods:
  0: #99 invokestatic java/lang/invoke/LambdaMetafactory.altMetafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #100 (Ljava/lang/Object;)V
      #101 invokestatic Demo.lambda$main$28d50090$1:(Ljava/lang/String;)V
      #102 (Ljava/lang/String;)V
      #103 5
      #104 0
  1: #99 invokestatic java/lang/invoke/LambdaMetafactory.altMetafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #100 (Ljava/lang/Object;)V
      #109 invokevirtual java/io/PrintStream.println:(Ljava/lang/String;)V
      #102 (Ljava/lang/String;)V
      #103 5
      #104 0
  2: #99 invokestatic java/lang/invoke/LambdaMetafactory.altMetafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #100 (Ljava/lang/Object;)V
      #111 invokestatic Demo.lambda$main$871ceed3$1:(Ljava/io/PrintStream;Ljava/lang/String;)V
      #102 (Ljava/lang/String;)V
      #103 5
      #104 0
import java.io.*;
import org.apache.spark.api.java.function.VoidFunction;

public class Demo {
  public static void main(String[] args) throws Exception {
    VoidFunction<String> c1 = s -> System.out.println(s); // non-capturing lambda
    VoidFunction<String> c2 = System.out::println;        // instance method reference
    PrintStream sysout = System.out; // PrintStream doesn't implement Serializable
    VoidFunction<String> c3 = s -> sysout.println(s);     // capturing lambda

    // all print true because VoidFunction extends Serializable
    System.out.println(c1 instanceof Serializable);
    System.out.println(c2 instanceof Serializable);
    System.out.println(c3 instanceof Serializable);

    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    // try serializing the non-capturing lambda
    boolean success = false;
    try {
      ObjectOutputStream out = new ObjectOutputStream(bos);
      out.writeObject(c1); // succeed
      success = true;
    } catch (Exception e) {
      System.out.println("c1 serialization failed");
      e.printStackTrace(System.out);
    }
    if (success) System.out.println("c1 serialization succeeded");

    // try serializing the instance method reference
    success = false;
    try {
      ObjectOutputStream out = new ObjectOutputStream(bos);
      out.writeObject(c2); // fail
      success = true;
    } catch (Exception e) {
      System.out.println("c2 serialization failed");
      e.printStackTrace(System.out);
    }
    if (success) System.out.println("c2 serialization succeeded");

    // try serializing the capturing lambda
    success = false;
    try {
      ObjectOutputStream out = new ObjectOutputStream(bos);
      out.writeObject(c3); // fail
      success = true;
    } catch (Exception e) {
      System.out.println("c3 serialization failed");
      e.printStackTrace(System.out);
    }
    if (success) System.out.println("c3 serialization succeeded");
  }
}
$ javap -verbose -c -s -l -private Demo\$\$Lambda\$3
Classfile /private/tmp/Demo$$Lambda$3.class
  Last modified Oct 12, 2016; size 1028 bytes
  MD5 checksum 64356872527a0a3849cc8cf1ceff217a
final class Demo$$Lambda$3 implements org.apache.spark.api.java.function.VoidFunction
  minor version: 0
  major version: 52
  flags: ACC_FINAL, ACC_SUPER, ACC_SYNTHETIC
Constant pool:
   #1 = Utf8               Demo$$Lambda$3
   #2 = Class              #1             // Demo$$Lambda$3
   #3 = Utf8               java/lang/Object
   #4 = Class              #3             // java/lang/Object
   #5 = Utf8               org/apache/spark/api/java/function/VoidFunction
   #6 = Class              #5             // org/apache/spark/api/java/function/VoidFunction
   #7 = Utf8               arg$1
   #8 = Utf8               Ljava/io/PrintStream;
   #9 = Utf8               <init>
  #10 = Utf8               (Ljava/io/PrintStream;)V
  #11 = Utf8               ()V
  #12 = NameAndType        #9:#11         // "<init>":()V
  #13 = Methodref          #4.#12         // java/lang/Object."<init>":()V
  #14 = NameAndType        #7:#8          // arg$1:Ljava/io/PrintStream;
  #15 = Fieldref           #2.#14         // Demo$$Lambda$3.arg$1:Ljava/io/PrintStream;
  #16 = Utf8               get$Lambda
  #17 = Utf8               (Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
  #18 = NameAndType        #9:#10         // "<init>":(Ljava/io/PrintStream;)V
  #19 = Methodref          #2.#18         // Demo$$Lambda$3."<init>":(Ljava/io/PrintStream;)V
  #20 = Utf8               call
  #21 = Utf8               (Ljava/lang/Object;)V
  #22 = Utf8               Ljava/lang/invoke/LambdaForm$Hidden;
  #23 = Utf8               java/lang/String
  #24 = Class              #23            // java/lang/String
  #25 = Utf8               Demo
  #26 = Class              #25            // Demo
  #27 = Utf8               lambda$main$871ceed3$1
  #28 = Utf8               (Ljava/io/PrintStream;Ljava/lang/String;)V
  #29 = NameAndType        #27:#28        // lambda$main$871ceed3$1:(Ljava/io/PrintStream;Ljava/lang/String;)V
  #30 = Methodref          #26.#29        // Demo.lambda$main$871ceed3$1:(Ljava/io/PrintStream;Ljava/lang/String;)V
  #31 = Utf8               writeReplace
  #32 = Utf8               ()Ljava/lang/Object;
  #33 = Utf8               java/lang/invoke/SerializedLambda
  #34 = Class              #33            // java/lang/invoke/SerializedLambda
  #35 = String             #5             // org/apache/spark/api/java/function/VoidFunction
  #36 = String             #20            // call
  #37 = String             #21            // (Ljava/lang/Object;)V
  #38 = Integer            6
  #39 = String             #25            // Demo
  #40 = String             #27            // lambda$main$871ceed3$1
  #41 = String             #28            // (Ljava/io/PrintStream;Ljava/lang/String;)V
  #42 = Utf8               (Ljava/lang/String;)V
  #43 = String             #42            // (Ljava/lang/String;)V
  #44 = Utf8               (Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #45 = NameAndType        #9:#44         // "<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #46 = Methodref          #34.#45        // java/lang/invoke/SerializedLambda."<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #47 = Utf8               Code
  #48 = Utf8               RuntimeVisibleAnnotations
{
  private final java.io.PrintStream arg$1;
    descriptor: Ljava/io/PrintStream;
    flags: ACC_PRIVATE, ACC_FINAL

  private Demo$$Lambda$3(java.io.PrintStream);
    descriptor: (Ljava/io/PrintStream;)V
    flags: ACC_PRIVATE
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: invokespecial #13                 // Method java/lang/Object."<init>":()V
         4: aload_0
         5: aload_1
         6: putfield      #15                 // Field arg$1:Ljava/io/PrintStream;
         9: return

  private static org.apache.spark.api.java.function.VoidFunction get$Lambda(java.io.PrintStream);
    descriptor: (Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
    flags: ACC_PRIVATE, ACC_STATIC
    Code:
      stack=3, locals=1, args_size=1
         0: new           #2                  // class Demo$$Lambda$3
         3: dup
         4: aload_0
         5: invokespecial #19                 // Method "<init>":(Ljava/io/PrintStream;)V
         8: areturn

  public void call(java.lang.Object);
    descriptor: (Ljava/lang/Object;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: getfield      #15                 // Field arg$1:Ljava/io/PrintStream;
         4: aload_1
         5: checkcast     #24                 // class java/lang/String
         8: invokestatic  #30                 // Method Demo.lambda$main$871ceed3$1:(Ljava/io/PrintStream;Ljava/lang/String;)V
        11: return
    RuntimeVisibleAnnotations:
      0: #22()

  private final java.lang.Object writeReplace();
    descriptor: ()Ljava/lang/Object;
    flags: ACC_PRIVATE, ACC_FINAL
    Code:
      stack=15, locals=1, args_size=1
         0: new           #34                 // class java/lang/invoke/SerializedLambda
         3: dup
         4: ldc           #26                 // class Demo
         6: ldc           #35                 // String org/apache/spark/api/java/function/VoidFunction
         8: ldc           #36                 // String call
        10: ldc           #37                 // String (Ljava/lang/Object;)V
        12: ldc           #38                 // int 6
        14: ldc           #39                 // String Demo
        16: ldc           #40                 // String lambda$main$871ceed3$1
        18: ldc           #41                 // String (Ljava/io/PrintStream;Ljava/lang/String;)V
        20: ldc           #43                 // String (Ljava/lang/String;)V
        22: iconst_1
        23: anewarray     #4                  // class java/lang/Object
        26: dup
        27: iconst_0
        28: aload_0
        29: getfield      #15                 // Field arg$1:Ljava/io/PrintStream;
        32: aastore
        33: invokespecial #46                 // Method java/lang/invoke/SerializedLambda."<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
        36: areturn
}
$ javap -verbose -c -s -l -private Demo\$\$Lambda\$2
Classfile /private/tmp/Demo$$Lambda$2.class
  Last modified Oct 12, 2016; size 990 bytes
  MD5 checksum 90fc2d221dc8ad3cf6e8f6287a6180cd
final class Demo$$Lambda$2 implements org.apache.spark.api.java.function.VoidFunction
  minor version: 0
  major version: 52
  flags: ACC_FINAL, ACC_SUPER, ACC_SYNTHETIC
Constant pool:
   #1 = Utf8               Demo$$Lambda$2
   #2 = Class              #1             // Demo$$Lambda$2
   #3 = Utf8               java/lang/Object
   #4 = Class              #3             // java/lang/Object
   #5 = Utf8               org/apache/spark/api/java/function/VoidFunction
   #6 = Class              #5             // org/apache/spark/api/java/function/VoidFunction
   #7 = Utf8               arg$1
   #8 = Utf8               Ljava/io/PrintStream;
   #9 = Utf8               <init>
  #10 = Utf8               (Ljava/io/PrintStream;)V
  #11 = Utf8               ()V
  #12 = NameAndType        #9:#11         // "<init>":()V
  #13 = Methodref          #4.#12         // java/lang/Object."<init>":()V
  #14 = NameAndType        #7:#8          // arg$1:Ljava/io/PrintStream;
  #15 = Fieldref           #2.#14         // Demo$$Lambda$2.arg$1:Ljava/io/PrintStream;
  #16 = Utf8               get$Lambda
  #17 = Utf8               (Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
  #18 = NameAndType        #9:#10         // "<init>":(Ljava/io/PrintStream;)V
  #19 = Methodref          #2.#18         // Demo$$Lambda$2."<init>":(Ljava/io/PrintStream;)V
  #20 = Utf8               call
  #21 = Utf8               (Ljava/lang/Object;)V
  #22 = Utf8               Ljava/lang/invoke/LambdaForm$Hidden;
  #23 = Utf8               java/lang/String
  #24 = Class              #23            // java/lang/String
  #25 = Utf8               java/io/PrintStream
  #26 = Class              #25            // java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
  #29 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #30 = Methodref          #26.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V
  #31 = Utf8               writeReplace
  #32 = Utf8               ()Ljava/lang/Object;
  #33 = Utf8               java/lang/invoke/SerializedLambda
  #34 = Class              #33            // java/lang/invoke/SerializedLambda
  #35 = Utf8               Demo
  #36 = Class              #35            // Demo
  #37 = String             #5             // org/apache/spark/api/java/function/VoidFunction
  #38 = String             #20            // call
  #39 = String             #21            // (Ljava/lang/Object;)V
  #40 = Integer            5
  #41 = String             #25            // java/io/PrintStream
  #42 = String             #27            // println
  #43 = String             #28            // (Ljava/lang/String;)V
  #44 = Utf8               (Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #45 = NameAndType        #9:#44         // "<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #46 = Methodref          #34.#45        // java/lang/invoke/SerializedLambda."<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #47 = Utf8               Code
  #48 = Utf8               RuntimeVisibleAnnotations
{
  private final java.io.PrintStream arg$1;
    descriptor: Ljava/io/PrintStream;
    flags: ACC_PRIVATE, ACC_FINAL

  private Demo$$Lambda$2(java.io.PrintStream);
    descriptor: (Ljava/io/PrintStream;)V
    flags: ACC_PRIVATE
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: invokespecial #13                 // Method java/lang/Object."<init>":()V
         4: aload_0
         5: aload_1
         6: putfield      #15                 // Field arg$1:Ljava/io/PrintStream;
         9: return

  private static org.apache.spark.api.java.function.VoidFunction get$Lambda(java.io.PrintStream);
    descriptor: (Ljava/io/PrintStream;)Lorg/apache/spark/api/java/function/VoidFunction;
    flags: ACC_PRIVATE, ACC_STATIC
    Code:
      stack=3, locals=1, args_size=1
         0: new           #2                  // class Demo$$Lambda$2
         3: dup
         4: aload_0
         5: invokespecial #19                 // Method "<init>":(Ljava/io/PrintStream;)V
         8: areturn

  public void call(java.lang.Object);
    descriptor: (Ljava/lang/Object;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: getfield      #15                 // Field arg$1:Ljava/io/PrintStream;
         4: aload_1
         5: checkcast     #24                 // class java/lang/String
         8: invokevirtual #30                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        11: return
    RuntimeVisibleAnnotations:
      0: #22()

  private final java.lang.Object writeReplace();
    descriptor: ()Ljava/lang/Object;
    flags: ACC_PRIVATE, ACC_FINAL
    Code:
      stack=15, locals=1, args_size=1
         0: new           #34                 // class java/lang/invoke/SerializedLambda
         3: dup
         4: ldc           #36                 // class Demo
         6: ldc           #37                 // String org/apache/spark/api/java/function/VoidFunction
         8: ldc           #38                 // String call
        10: ldc           #39                 // String (Ljava/lang/Object;)V
        12: ldc           #40                 // int 5
        14: ldc           #41                 // String java/io/PrintStream
        16: ldc           #42                 // String println
        18: ldc           #43                 // String (Ljava/lang/String;)V
        20: ldc           #43                 // String (Ljava/lang/String;)V
        22: iconst_1
        23: anewarray     #4                  // class java/lang/Object
        26: dup
        27: iconst_0
        28: aload_0
        29: getfield      #15                 // Field arg$1:Ljava/io/PrintStream;
        32: aastore
        33: invokespecial #46                 // Method java/lang/invoke/SerializedLambda."<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
        36: areturn
}
$ javap -verbose -c -s -l -private Demo\$\$Lambda\$1
Classfile /private/tmp/Demo$$Lambda$1.class
  Last modified Oct 12, 2016; size 754 bytes
  MD5 checksum 81ce9dafbca34417b2dfa94f596a85a1
final class Demo$$Lambda$1 implements org.apache.spark.api.java.function.VoidFunction
  minor version: 0
  major version: 52
  flags: ACC_FINAL, ACC_SUPER, ACC_SYNTHETIC
Constant pool:
   #1 = Utf8               Demo$$Lambda$1
   #2 = Class              #1             // Demo$$Lambda$1
   #3 = Utf8               java/lang/Object
   #4 = Class              #3             // java/lang/Object
   #5 = Utf8               org/apache/spark/api/java/function/VoidFunction
   #6 = Class              #5             // org/apache/spark/api/java/function/VoidFunction
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = NameAndType        #7:#8          // "<init>":()V
  #10 = Methodref          #4.#9          // java/lang/Object."<init>":()V
  #11 = Utf8               call
  #12 = Utf8               (Ljava/lang/Object;)V
  #13 = Utf8               Ljava/lang/invoke/LambdaForm$Hidden;
  #14 = Utf8               java/lang/String
  #15 = Class              #14            // java/lang/String
  #16 = Utf8               Demo
  #17 = Class              #16            // Demo
  #18 = Utf8               lambda$main$28d50090$1
  #19 = Utf8               (Ljava/lang/String;)V
  #20 = NameAndType        #18:#19        // lambda$main$28d50090$1:(Ljava/lang/String;)V
  #21 = Methodref          #17.#20        // Demo.lambda$main$28d50090$1:(Ljava/lang/String;)V
  #22 = Utf8               writeReplace
  #23 = Utf8               ()Ljava/lang/Object;
  #24 = Utf8               java/lang/invoke/SerializedLambda
  #25 = Class              #24            // java/lang/invoke/SerializedLambda
  #26 = String             #5             // org/apache/spark/api/java/function/VoidFunction
  #27 = String             #11            // call
  #28 = String             #12            // (Ljava/lang/Object;)V
  #29 = Integer            6
  #30 = String             #16            // Demo
  #31 = String             #18            // lambda$main$28d50090$1
  #32 = String             #19            // (Ljava/lang/String;)V
  #33 = Utf8               (Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #34 = NameAndType        #7:#33         // "<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #35 = Methodref          #25.#34        // java/lang/invoke/SerializedLambda."<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
  #36 = Utf8               Code
  #37 = Utf8               RuntimeVisibleAnnotations
{
  private Demo$$Lambda$1();
    descriptor: ()V
    flags: ACC_PRIVATE
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #10                 // Method java/lang/Object."<init>":()V
         4: return

  public void call(java.lang.Object);
    descriptor: (Ljava/lang/Object;)V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=2, args_size=2
         0: aload_1
         1: checkcast     #15                 // class java/lang/String
         4: invokestatic  #21                 // Method Demo.lambda$main$28d50090$1:(Ljava/lang/String;)V
         7: return
    RuntimeVisibleAnnotations:
      0: #13()

  private final java.lang.Object writeReplace();
    descriptor: ()Ljava/lang/Object;
    flags: ACC_PRIVATE, ACC_FINAL
    Code:
      stack=12, locals=1, args_size=1
         0: new           #25                 // class java/lang/invoke/SerializedLambda
         3: dup
         4: ldc           #17                 // class Demo
         6: ldc           #26                 // String org/apache/spark/api/java/function/VoidFunction
         8: ldc           #27                 // String call
        10: ldc           #28                 // String (Ljava/lang/Object;)V
        12: ldc           #29                 // int 6
        14: ldc           #30                 // String Demo
        16: ldc           #31                 // String lambda$main$28d50090$1
        18: ldc           #32                 // String (Ljava/lang/String;)V
        20: ldc           #32                 // String (Ljava/lang/String;)V
        22: iconst_0
        23: anewarray     #4                  // class java/lang/Object
        26: invokespecial #35                 // Method java/lang/invoke/SerializedLambda."<init>":(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
        29: areturn
}