Java之lambda表达式,
Java之lambda表达式,
#0 预备知识
0.1函数式接口
定义:只有一个抽象方法的接口,例如Comparator接口:
public Interface Comparator<T>{
int compare(T first, T second);
}
值得注意的是, 函数式接口可以有别的非抽象的方法
0.2.方法引用(Method Reference)
定义:本质上是lambda的简写
System.out::println
等同于
x->
System.out.println(x)
方法引用的格式:
1.object::instanceMethod = 提供方法参数的lambda
2.Class::staticMethod = 提供方法参数的lambda
3.Class::instanceMethod =第一个参数会成为方法的目标
0.3构造器引用
和方法引用类似,不过特指引用构造器,方法名都是new
int[]::new
等价于
x->new int[x]
#1 感性认识lambda表达式
(String first, String second)
->first.length()-second.length()
#2 lambda表达式的定义&存在的意义
lambda表达式是一个代码块,或者说一个带参数的表达式,可以看做是一个函数,而不是一个对象,以后可以执行一次或多次。lambda表达式可以代替只有一个抽象方法的接口对象。
lambda表达式由三部分组成:
1.参数
2.一个代码块
3.自由变量的值(外围自由变量的值,此变量必须为实际上的最终变量)
#3 语法
1.若表达式只有一行,可以省略{},否则不能省略;
2.若表达式没有参数,就写空括号();
3.如果编译器可以推导出参数类型,就可以省略参数类型;
(first, second)
->first.length()-second.length();
4.如果表达式只有一个参数,且编译器可以推导出这个参数的类型,则可以省略参数和();
event->
System.out.println("hello")
5.无需指定返回值类型,编译器可以自己推导出.
#4使用
可以用lambda表达式创建函数式接口对象
例如创建新线程:
传统的方式:
new Thread(new Runnale(){
public void run(){
System.out.println("使用匿名类创建新Thread");
}
}).start();
若使用lambda表达式
new Thread(()->
System.out.println("使用lambda创建thread");
).start();
可以看出使用lambda表达式取代内部类,十分简洁明了
#5注意事项
lambda表达式只能赋值给明确的函数式接口对象,例如目标类型不能是Object类。
下面的操作会导致编译器报错:The target type of this expression must be a functional interface
Object obj=()->System.out.println("hello_lambda");
相关文章
- 暂无相关文章
用户点评