美文网首页
java8 lamba和anonymous

java8 lamba和anonymous

作者: patrick002 | 来源:发表于2017-10-10 10:33 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/xscvyxtx.html