Lambda表达式
假设我们需要对一串数组使用匿名内部类进行处理
public class Lambdats {
public static void main(String[] args){
//这里省略接口和匿名实现类
Array ay = new Arry();
int target[] = {1,2,3,4};
//使用匿名内部类处理数组
//传入target变量和COmmand()构造器
ay.process(target , new Command(){
//重写方法
public void process(int target[]){
int sum = 0;
//数组编历
for(int tmp : target){
sum = sum + tmp;
}
System.out.println("数组之和:" + sum);
}
});
}
}
这里传入了process处理行为的方法,然后又要在匿名内部类中对其进行重写,显得繁琐
所以我们使用Lambda表达来简化代码
public class Lambdats {
public static void main(String[] args){
//这里省略接口和匿名实现类
Array ay = new Arry();
int array[] = {1,2,3,4};
//使用匿名内部类处理数组
//传入target变量和COmmand()构造器
ay.process(array , (int target[])->{
int sum = 0;
//数组编历
for(int tmp : target){
sum = sum + tmp;
}
System.out.println("数组之和:" + sum);
});
}
}
从这个例子可以看出,我们只传入了一个待处理的数组和一个process方法的形参列表就对process方法实现了重写
Lambda表达式组成
1.形参列表:形参列表运行省略形参类型,只有一个参数的时候甚至可以省略形参列表的括号
2.箭头(->)
3.代码块.如果Lambda代码块只包含一条语句,则Lambda表达式运行省略代码块的花括号.
运用例子
public class Lambdats {
public static void main(String[] args){
//对匿名实现类实例化
Lambdamv lb = new Lambdamv();
//使用Lambda表达式
lb.dogmv(name -> System.out.println(name + "is running"));//省略了花括号,只有一条语句
lb.addable((a,b)-> {
int rs = 0;
rs = a + b;
System.out.println(rs);
return a + b;
});
}
}
interface Dog{
void run(String name);
}
interface add{
int Result(int a , int b);
}
//匿名实现类来描述行为
class Lambdamv{
public void dogmv(Dog d){
d.run("dog");//传入接口数据
}
public void addable(add ad){
ad.Result(2 , 3);
}
}
由以上例子可以看出Lambda表达式可以被当作任意类型的参数来传入
Lambda表达式的类型也称为 目标类型,结果就是被当成对象,所以我们可以用Lambda表达式进行赋值
因为Lambda表达式被当作对象,所以可以直接对Runnable 接口的R对象直接进行赋值
需要注意的是 Lambda表达式的赋值对象必须是明确的函数接口,且Lambda表达式只能实现一个方法