Last active
December 17, 2015 07:59
-
-
Save knjname/5577309 to your computer and use it in GitHub Desktop.
書いてて自分でも頭が混乱する
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| https://gist.github.com/knjname/5577309 でできる LambdaCurrying$MyBiFunction.class を javap -vした結果 | |
| Classfile /C:/Users/owner/IdeaProjects/untitled/src/LambdaCurrying$MyBiFunction.class | |
| Last modified 2013/05/15; size 1180 bytes | |
| MD5 checksum d62a71ac0f6a7cf62a62ef17ad09bdd2 | |
| Compiled from "LambdaCurrying.java" | |
| public interface LambdaCurrying$MyBiFunction<A extends java.lang.Object, B extends java.lang.Object, C extends java.lang.Object> | |
| Signature: #15 // <A:Ljava/lang/Object;B:Ljava/lang/Object;C:Ljava/lang/Object;>Ljava/lang/Object; | |
| SourceFile: "LambdaCurrying.java" | |
| InnerClasses: | |
| public static #27= #3 of #25; //MyBiFunction=class LambdaCurrying$MyBiFunction of class LambdaCurrying | |
| public static final #44= #43 of #47; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles | |
| BootstrapMethods: | |
| 0: #19 invokestatic java/lang/invoke/LambdaMetafactory.metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; | |
| Method arguments: | |
| #20 invokeinterface java/util/function/Function.apply:(Ljava/lang/Object;)Ljava/lang/Object; | |
| #21 invokestatic LambdaCurrying$MyBiFunction.lambda$2:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
| #22 (Ljava/lang/Object;)Ljava/lang/Object; | |
| minor version: 0 | |
| major version: 52 | |
| flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT | |
| Constant pool: | |
| #1 = InvokeDynamic #0:#23 // #0:lambda$:(Ljava/lang/Object;)Ljava/util/function/Function; | |
| #2 = InterfaceMethodref #3.#24 // LambdaCurrying$MyBiFunction.apply:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
| #3 = Class #26 // LambdaCurrying$MyBiFunction | |
| #4 = Class #29 // java/lang/Object | |
| #5 = Utf8 partial | |
| #6 = Utf8 (Ljava/lang/Object;)Ljava/util/function/Function; | |
| #7 = Utf8 Code | |
| #8 = Utf8 LineNumberTable | |
| #9 = Utf8 Signature | |
| #10 = Utf8 (TA;)Ljava/util/function/Function<TB;TC;>; | |
| #11 = Utf8 apply | |
| #12 = Utf8 (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
| #13 = Utf8 (TA;TB;)TC; | |
| #14 = Utf8 lambda$2 | |
| #15 = Utf8 <A:Ljava/lang/Object;B:Ljava/lang/Object;C:Ljava/lang/Object;>Ljava/lang/Object; | |
| #16 = Utf8 SourceFile | |
| #17 = Utf8 LambdaCurrying.java | |
| #18 = Utf8 BootstrapMethods | |
| #19 = MethodHandle #6:#30 // invokestatic java/lang/invoke/LambdaMetafactory.metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; | |
| #20 = MethodHandle #9:#31 // invokeinterface java/util/function/Function.apply:(Ljava/lang/Object;)Ljava/lang/Object; | |
| #21 = MethodHandle #6:#32 // invokestatic LambdaCurrying$MyBiFunction.lambda$2:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
| #22 = MethodType #33 // (Ljava/lang/Object;)Ljava/lang/Object; | |
| #23 = NameAndType #34:#6 // lambda$:(Ljava/lang/Object;)Ljava/util/function/Function; | |
| #24 = NameAndType #11:#12 // apply:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
| #25 = Class #35 // LambdaCurrying | |
| #26 = Utf8 LambdaCurrying$MyBiFunction | |
| #27 = Utf8 MyBiFunction | |
| #28 = Utf8 InnerClasses | |
| #29 = Utf8 java/lang/Object | |
| #30 = Methodref #36.#37 // java/lang/invoke/LambdaMetafactory.metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; | |
| #31 = InterfaceMethodref #38.#39 // java/util/function/Function.apply:(Ljava/lang/Object;)Ljava/lang/Object; | |
| #32 = InterfaceMethodref #3.#40 // LambdaCurrying$MyBiFunction.lambda$2:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
| #33 = Utf8 (Ljava/lang/Object;)Ljava/lang/Object; | |
| #34 = Utf8 lambda$ | |
| #35 = Utf8 LambdaCurrying | |
| #36 = Class #41 // java/lang/invoke/LambdaMetafactory | |
| #37 = NameAndType #42:#45 // metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; | |
| #38 = Class #46 // java/util/function/Function | |
| #39 = NameAndType #11:#33 // apply:(Ljava/lang/Object;)Ljava/lang/Object; | |
| #40 = NameAndType #14:#12 // lambda$2:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
| #41 = Utf8 java/lang/invoke/LambdaMetafactory | |
| #42 = Utf8 metaFactory | |
| #43 = Class #48 // java/lang/invoke/MethodHandles$Lookup | |
| #44 = Utf8 Lookup | |
| #45 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; | |
| #46 = Utf8 java/util/function/Function | |
| #47 = Class #49 // java/lang/invoke/MethodHandles | |
| #48 = Utf8 java/lang/invoke/MethodHandles$Lookup | |
| #49 = Utf8 java/lang/invoke/MethodHandles | |
| { | |
| public java.util.function.Function<B, C> partial(A); | |
| descriptor: (Ljava/lang/Object;)Ljava/util/function/Function; | |
| flags: ACC_PUBLIC | |
| Code: | |
| stack=1, locals=2, args_size=2 | |
| 0: aload_1 | |
| 1: invokedynamic #1, 0 // InvokeDynamic #0:lambda$:(Ljava/lang/Object;)Ljava/util/function/Function; | |
| 6: areturn | |
| LineNumberTable: | |
| line 22: 0 | |
| Signature: #10 // (TA;)Ljava/util/function/Function<TB;TC;>; | |
| public abstract C apply(A, B); | |
| descriptor: (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
| flags: ACC_PUBLIC, ACC_ABSTRACT | |
| Signature: #13 // (TA;TB;)TC; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.util.function.Function; | |
| public class LambdaCurrying { | |
| public interface QuadFunction<A, B, C, D, E>{ | |
| default TriFunction<B, C, D, E> partial(A a){ | |
| return (b, c, d) -> this.apply(a, b, c, d); | |
| } | |
| E apply(A a,B b,C c,D d); | |
| } | |
| public interface TriFunction<A, B, C, D>{ | |
| default MyBiFunction<B, C, D> partial(A a){ | |
| return (b, c) -> this.apply(a, b, c); | |
| } | |
| D apply(A a,B b,C c); | |
| } | |
| /** alternative to {@link java.util.function.BiFunction } */ | |
| public interface MyBiFunction<A, B, C>{ | |
| default Function<B, C> partial(A a){ | |
| return b -> this.apply(a, b); | |
| } | |
| C apply(A a, B b); | |
| } | |
| String name; | |
| public String surroundName(String start, String end, String period){ | |
| return start + this.name + end + period; | |
| } | |
| QuadFunction<LambdaCurrying, String, String, String, String> quad = LambdaCurrying::surroundName; | |
| TriFunction<String, String, String, String> tri = quad.partial(this); | |
| MyBiFunction<String, String, String> bi = tri.partial("["); | |
| Function<String, String> mono = bi.partial("]"); | |
| String result = mono.apply("!!!"); | |
| TriFunction<String, String, String, String> anotherTri = this::surroundName; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment