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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,845评论 18 139
  • Java 8自Java 5(发行于2004)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发...
    谁在烽烟彼岸阅读 907评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,410评论 0 6
  • 写下这篇文字,缘于一个视频,男嘉宾张凯恩问三个女嘉宾一个问题:“如果两个人在一起时,男生把什么东西送给你们,你...
    绿色点点灰阅读 453评论 0 0