lambda表达式是JDK8的比较有鲜明特点的一个新特性,但是对于一些初学者来说,有的理解起来比较绕。下面我写一下我自己的理解。
lambda表达式是干什么用的?
谈lanmbda表达式之前还要必须说的一个东西是匿名内部类。
什么是匿名类?看下面这段代码区分匿名和非匿名的区别。
Demo01 demo01 = new Demo01(); //这是一个普通的类实例化
demo01.test1(); //通过该对象调用方法
new Demo01().test1(); //这是匿名对象实例化,并且直接调用方法
这是普通类的匿名对象创建,当然,匿名内部类创建方式也是一样的。
当一个方法的参数是一个接口时,在Java8之前我们有两种方式进行传参调用该方法
1、先创建这个接口的实现类去实现这个接口。new一个这个类的对象,然后将该对象作为参数传进方法中。
//这是一个接口
public interface UseInter {
void operation();
}
//这是接口实现类
public class UseInterImpl implements UseInter {
@Override
public void operation() {
System.out.println("这是通过接口实现类的方法重写的");
}
}
//主方法
public class Test {
public static void main(String[] args) {
Test test = new Test();
UseInter useInter = new UseInterImpl(); //new一个接口实现类的对象
test.interTest(useInter); //将这个对象作为参数传进去
}
void interTest(UseInter useInter) { //这个方法需要UseInter接口作为参数
useInter.operation();
}
}
2、通过匿名内部类的方式直接在调该方法的参数里面去创建
test.interTest(new UseInter() {
@Override
public void operation() {//这里可以直接重写接口的抽象方法
System.out.println("这是通过匿名内部类的方式");
}
});
是不是第二种方式比第一种简洁了许多。
在Java8出来后,出现的lambda表达式是匿名内部类的更简化版。
test.interTest(()-> {System.out.println("这是通过lambda表达式的方式");});
是不是很简洁优雅?,但是,不是所有的匿名内部类的方式都支持写成lambda表达式,lambda表达式的限定条件是该接口必须为函数式接口
函数式接口就是只有一个抽象方法的接口。
lambda表达式的语法
如果该接口的抽象方法带一个参数,可以这样
test.interTest(a -> System.out.println("这是通过lambda表达式的方式" + a));
两个或多个参数。
test.interTest((int a,int b) -> System.out.println("这是通过lambda表达式的方式" + a + b));