前置知识
- 内部类: Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类称为相对于内部类的外嵌类.
- 示例
//简单拿管理,老师,学生三者做三个类 public class Teacher{ //外嵌类的声明 Student student; //内部类的对象的声明 class Student{ //内部类的声明 void attendClass(){ System.out.println("上课"); } } } public class manage{ Teacher teacher = new Teacher(); teacher.student.attendClass(); //这就是内部类的一种用法,通过外嵌类对象调用内部类的对象 }
- 内部类的类体不可以声明类变量和类方法
- 声明内部类如同在类中声明方法或变量一样, 外嵌类可以把内部类的对象的声明视作自己的成员变量
- 外嵌类的成员变量在内部类中仍然有效, 内部类中的方法也可以调用外嵌类中的方法
- 外嵌类和内部类在编译时, 生成两个.class文件
- 示例
- 匿名内部类
- 若内部类的名字不重要的时候,便可使用它
- 示例
//一个打印狗吃肉的程序,版本一 public class Animal{ public abstract void eat(); } public class Dog() extends Animal{ @override public void eat(){ System.out.println("狗吃肉"); } } public class Demo(){ Dog dog = new Dog(); dog.eat(); }
//一个打印狗吃肉的程序,版本二 public class Animal{ public abstract void eat(); } public class Demo{ new Animal(){ @override public void eat(){ System.out.println("狗吃肉"); } }.eat(); }
//一个打印狗吃肉的程序,版本三 public class Animal{ public abstract void eat(); } public class Demo{ Animal animal = new Animal(){ @override public void eat(){ System.out.println("狗吃肉"); } } //这样就可以实现内部类中方法的便捷使用. animal.eat(); }
Lambda表达式
- 不关心类的名字,以及方法的名字,只关心数据的操作,
便是Lambda表达式的用武之地 - 核心原则,可推导可省略
- (参数列表) -> {代码}
- 示例
//如使用匿名内部类,程序如下 new Thread(new Runnable() { @override public void run(){ System.out.println("线程启动"); } }).start();
//当然使用Lambda表达式,程序会大大简化 new Thread(() -> { System.out.println("线程启动") }).start();
- 省略规则
- 参数类型可以省略
- 假如只有一个参数,()可以省略
- 如果方法体只有一条语句,{}可以省略
- 如果方法体中唯一的语句是return,那省略大括号的同时,return也要省略
- 方法引用
- 如果多个Lambda表达式实现函数是一样的,就可以封装为通用方法,以便于维护,即用方法引用实现
- 对象::方法
- 如有static修饰,即类名::方法