理解Function Interface(函数式接口)是学习Java8 Lambda表达式的关键所在;
为什么使用Lambda表达式
1、避免匿名内部类定义过多;
2、代码更简洁;
3、去掉一些无意义的代码,留下代码的核心;
4、其实质是函数式编程。
函数式接口定义
1、任何接口,倘若只包含一个唯一的抽象方法,那么他就是一个函数式的接口;
public interface Runnable{
public abstract void run();
}
2、对于函数式接口,我们都可以通过Lambda表达式来创建该接口对象。
测试样例代码:
public class LambdaTest2 {
//静态内部类
static class TestLambda2 implements ItestLambda{
@Override
public void buyHouse(String method,String name) {
System.out.println("使用【"+method+"】方式,我们准备买【"+name+"】的房子。");
}
}
public static void main(String[] args) {
//静态内部类
ItestLambda test2=new TestLambda2();
test2.buyHouse("静态内部类","东投-海棠之恋");
//局部内部类
class TestLambda2 implements ItestLambda{
@Override
public void buyHouse(String method,String name) {
System.out.println("使用【"+method+"】方式,我们准备买【"+name+"】的房子。");
}
}
test2=new TestLambda2();
test2.buyHouse("局部内部类","南昌旭辉中心");
//匿名内部类
test2=new ItestLambda() {
@Override
public void buyHouse(String method, String name) {
System.out.println("使用【"+method+"】方式,我们准备买【"+name+"】的房子。");
}
};
test2.buyHouse("匿名内部类","金科集美天辰");
//lambda表达式
test2=(String method,String name)->{
System.out.println("使用【"+method+"】方式,我们准备买【"+name+"】的房子。");
};
test2.buyHouse("lambda表达式","赣电东方城");
}
}
interface ItestLambda{
void buyHouse(String method,String name);
}
class TestLambda2 implements ItestLambda{
@Override
public void buyHouse(String method,String name) {
System.out.println("使用【"+method+"】方式,我们准备买【"+name+"】的房子。");
}
内部类
内部类就是在一个类的内部定义了一个类,比如在Class
A中定义了一个B类,那么B类对于A类来说就是内部类,A类对于B类来说就是外部类了
1、成员内部类
我们可以使用成员内部类来获得外部的某些私有的属性
2、局部内部类
局部内部类写在外部类的某个代码块或者方法块中,如果只在某个方法或块中创建这个类的某些对象,可以使用局部内部类。
3、匿名内部类
匿名内部类是在new的后面,可以用来实现一个接口或者继承一个类。
4、静态内部类
在声明的类的时候加上static关键字,他与外部类的属性,方法是并列关系。
Lambda表达式简化
1、Lambda表达式只能有一行的情况下才能简化成一行,如果有多行,必须要用代码块包裹;
2、前提是接口必须为函数式接口(任何接口如果只包含唯一的一个抽象方法,那他就是函数式接口);
3、方法包含多个参数可以去掉参数类型,要去掉的话就都去掉,必须加上括号
//lambda表达式
test2=(String method,String name)->{
System.out.println("使用【"+method+"】方式,我们准备买【"+name+"】的房子。");
};
test2.buyHouse("lambda表达式","赣电东方城");
//lambda表达式简化
test2=(method,name)-> System.out.println("使用【"+method+"】方式,我们准备买【"+name+"】的房子。");
test2.buyHouse("lambda简化","绿地玫瑰城");