Skip to content

Instantly share code, notes, and snippets.

@knjname
Last active December 17, 2015 07:59
Show Gist options
  • Select an option

  • Save knjname/5577309 to your computer and use it in GitHub Desktop.

Select an option

Save knjname/5577309 to your computer and use it in GitHub Desktop.
書いてて自分でも頭が混乱する
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;
}
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