本质上是一个匿名的方法:
先看下面这个例子,一个传统的方法
`public int add(int x,int y){
return x+y;
}`
转换为Lambda之后就是下面这个样子
(int x,int y)->x+y //表达式
(int x,int y)->{return x+y};//语句块
lamdba表达式的组成:参数列表,箭头,以及一个语句块或者是表达式. 如下
()->{}
()为参数列表,参数的类型可以省略,Java编译器可以自动推断. 如果只有一个参数且可以被Java推断出类型,那么参数列表的括号也可以省略.
Lambda表达式的类型叫做”目标类型”,他是一个”函数接口”(定义:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。)
所以可以将Lambda表达式为一个函数接口赋值,如下
Runable接口就是一个函数接口,因为他只有一个显示声明的抽象run方法.所以可以如下使用lambda表达式.
Runable r1 = ()->{System.out.println("motian")};
一个λ表达式只有在转型成一个函数接口后才能被当做Object使用。
所以不能如下使用:
System.out.println(()->{System.out.println("motian")});
必须将先将Lambda转型如下
System.out.println((Runable)()->{System.out.println("motian")});
一个Lambda可以有多个目标的类型(函数接口),只要函数匹配成功就行.但至少应该有一个.
所以如下是可以的
Runnable r1 =() -> {System.out.println("mo");};
MyRunnable2 r2 = () -> {System.out.println("tian");};
应用
1.λ表达式主要用于替换,内部匿名类,各种回调,比如事件响应器、传入Thread类的Runnable等。如:
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("mo");
}
}
});
//可以如下书写
Thread lambda = new Thread(()->System.out.println("tian"));
2.Lambda表达式与集合类批处理操作
未使用Lambda表达式的的集合迭代操作
for(String str:list){
System.out.println(str);
}
使用后可以调整为
list.forEach(str->{System.out.println(str)})
未完待续。。。。