java8 lamba和anonymous

关于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

你可能感兴趣的:(java8 lamba和anonymous)