关于java8的lamba 在github 上 看到比较好的介绍, 有一些自己不清楚的,写在这里
主要是anonymous 和类型推断的一些
new Thread(()-> System.out.println("test lamba"))
带参
Collections.sort(list, (s1, s2) ->{// 省略参数表的类型
if(s1 == null)
return -1;
if(s2 == null)
return 1;
return s1.length()-s2.length();
});
能够使用Lambda的依据是必须有相应的函数接口
Lambda表达式另一个依据是类型推断机制
自定义函数实现lamba和anonymous
public interface ConsumerInterface{
void accept(T t);
}
ConsumerInterface consumer = str -> System.out.println(str);
class MyStream{
private List list;
...
public void myForEach(ConsumerInterface consumer){// 1
for(T t : list){
consumer.accept(t);
}
}
}
MyStream stream = new MyStream();
stream.myForEach(str -> System.out.println(str));// 使用自定义函数接口书写Lambda表达式
编译器,jvm lamba通过invokedynamic指令来执行
publicclassMainLambda{
publicstaticvoidmain(String[]args) {
newThread(
()->System.out.println("Lambda Thread run()")
).start();;
}
}
编译产生一个class, javap 之后
//javap -c -p MainLambda.classpublicclassMainLambda{...publicstaticvoidmain(java.lang.String[]);Code:0:new#2 // class java/lang/Thread 3: dup 4: invokedynamic #3, 0 //InvokeDynamic#0:run:()Ljava/lang/Runnable;/*使用invokedynamic指令调用*/9:invokespecial #4//Method java/lang/Thread."":(Ljava/lang/Runnable;)V12:invokevirtual #5//Method java/lang/Thread.start:()V15:returnprivatestaticvoid lambda$main$0();/*Lambda表达式被封装成主类的私有方法*/Code:0:getstatic #6//Field java/lang/System.out:Ljava/io/PrintStream;3:ldc #7//String Lambda Thread run()5:invokevirtual #8//Method java/io/PrintStream.println:(Ljava/lang/String;)V8:return}
Lambda表达式被封装成了主类的一个私有方法,并通过invokedynamic指令进行调用
lamba中this和外部是一样的
publicclassHello{
Runnabler1=()->{System.out.println(this); };
Runnabler2=()->{System.out.println(toString()); };
publicstaticvoidmain(String[]args) {
newHello().r1.run();
newHello().r2.run();
}
publicStringtoString() {return"Hello Hoolee"; }
}
打印两编Hello Hoolee