benf.org : other : cfr : Java 8 Lambda Serialisation |
I discussed java 8 lambdas in general here - but it's also really interesting to look at what happens in the case of serialisable lambdas....
@FunctionalInterface public interface LambdaTest21<INPUT> extends Consumer<INPUT>, Serializable { public void acceptWithThrowing(INPUT input); @Override public default void accept(INPUT input) { } public default LambdaTest21<INPUT> andThen(LambdaTest21<INPUT> consumer) { return input -> { acceptWithThrowing(input); }; } public default LambdaTest21<INPUT> butThen(LambdaTest21<INPUT> consumer) { return input -> { consumer.acceptWithThrowing(input); }; } }
Other than a few unnecessary casts, a pretty good job...
@FunctionalInterface public interface LambdaTest21<INPUT> extends Consumer<INPUT>, Serializable { public void acceptWithThrowing(INPUT var1); default public void accept(INPUT this_) { } default public LambdaTest21<INPUT> andThen(LambdaTest21<INPUT> lambdaTest21) { return arg_0 -> { this.acceptWithThrowing((INPUT)(arg_0)); } ; } default public LambdaTest21<INPUT> butThen(LambdaTest21<INPUT> lambdaTest21) { return arg_0 -> { lambdaTest21.acceptWithThrowing((INPUT)(arg_0)); } ; } }
It gets quite interesting if you turn off some of CFR's resugaring options. - if we run CFR with --removeboilerplate false --decodelambdas false, we get a really interesting look at what actually ended up in the output.... be prepared to scroll!
@FunctionalInterface public interface LambdaTest21<INPUT> extends Consumer<INPUT>, Serializable { public void acceptWithThrowing(INPUT var1); default public void accept(INPUT this_) { } default public LambdaTest21<INPUT> andThen(LambdaTest21<INPUT> lambdaTest21) { return (LambdaTest21<Object>)LambdaMetafactory.altMetaFactory(null, null, null, acceptWithThrowing(INPUT ), lambda$andThen$568f6e21$0(Object ), (Ljava/lang/Object;)V)((LambdaTest21)(this)); } default public LambdaTest21<INPUT> butThen(LambdaTest21<INPUT> lambdaTest21) { return (LambdaTest21<Object>)LambdaMetafactory.altMetaFactory(null, null, null, acceptWithThrowing(INPUT ), lambda$butThen$568f6e21$0(LambdaTest21 Object ), (Ljava/lang/Object;)V)((LambdaTest21)(this), lambdaTest21); } default private static /* synthetic */ Object $deserializeLambda$(SerializedLambda serializedLambda) { switch (serializedLambda.getImplMethodName()) { case "lambda$andThen$568f6e21$0": { if ((((((serializedLambda.getImplMethodKind() != 9) || (!(serializedLambda.getFunctionalInterfaceClass().equals("org/benf/cfr/tests/LambdaTest21")))) || (!(serializedLambda.getFunctionalInterfaceMethodName().equals("acceptWithThrowing")))) || (!(serializedLambda.getFunctionalInterfaceMethodSignature().equals("(Ljava/lang/Object;)V")))) || (!(serializedLambda.getImplClass().equals("org/benf/cfr/tests/LambdaTest21")))) || (!(serializedLambda.getImplMethodSignature().equals("(Ljava/lang/Object;)V")))) break; return (LambdaTest21<Object>)LambdaMetafactory.altMetaFactory(null, null, null, acceptWithThrowing(INPUT ), lambda$andThen$568f6e21$0(Object ), (Ljava/lang/Object;)V)((LambdaTest21)((LambdaTest21)(serializedLambda.getCapturedArg(0)))); } case "lambda$butThen$568f6e21$0": { if ((((((serializedLambda.getImplMethodKind() != 9) || (!(serializedLambda.getFunctionalInterfaceClass().equals("org/benf/cfr/tests/LambdaTest21")))) || (!(serializedLambda.getFunctionalInterfaceMethodName().equals("acceptWithThrowing")))) || (!(serializedLambda.getFunctionalInterfaceMethodSignature().equals("(Ljava/lang/Object;)V")))) || (!(serializedLambda.getImplClass().equals("org/benf/cfr/tests/LambdaTest21")))) || (!(serializedLambda.getImplMethodSignature().equals("(Lorg/benf/cfr/tests/LambdaTest21;Ljava/lang/Object;)V")))) break; return (LambdaTest21<Object>)LambdaMetafactory.altMetaFactory(null, null, null, acceptWithThrowing(INPUT ), lambda$butThen$568f6e21$0(LambdaTest21 Object ), (Ljava/lang/Object;)V)((LambdaTest21)((LambdaTest21)(serializedLambda.getCapturedArg(0))), (LambdaTest21)((LambdaTest21)(serializedLambda.getCapturedArg(1)))); } } throw new IllegalArgumentException("Invalid lambda deserialization"); } default public /* synthetic */ void lambda$butThen$568f6e21$0(LambdaTest21 lambdaTest21, Object object) { lambdaTest21.acceptWithThrowing((INPUT)(object)); } default public /* synthetic */ void lambda$andThen$568f6e21$0(Object object) { this.acceptWithThrowing((INPUT)(object)); } }
Wow! - and that's also using a string switch, which is itself sugared
Last updated 09/2013 |