Java 8 新增的lambda表达式
Lambda 转换:
Lambda表达式组成:
形参列表
箭头 ( ->) 必须通过英文中画线和大于符号组成
代码块,如果只有一条语句,Lambda表达式允许省略花括号
Lambda简化写法
Lambda表达式与函数式接口
Lambda表达式的类型也称为目标类型,其必须是函数式接口(只包含一个抽象方法的接口)
Lambda表达式进行赋值:
Lambda表达式的目标类型必须是明确的函数式接口
Lambda表达式只能为函数式接口创建对象,Lambda表达式只能实现一个方法,只能为只有一个抽象方法的接口创建对象
为保证Lambda表达式的目标类型是一个明确的函数式接口:
*将Lambda表达式赋值给函数式接口类型的变量
*将Lambda表达式作为函数式接口类型的参数传给某个方法
*使用函数式接口对Lambda表达式进行强制类型转换
方法引用和构造器引用
Lambda表达式与匿名内部类的联系和区别
Lambda表达式与匿名内部类一样,都可以直接访问effectively final的局部变量,以及外部类的成员变量
Lambda表达式创建的对象和匿名内部类生成的对象一样,都可以直接调用从接口中承接的默认方法
Lambda表达式匿名内部类的主要区别:
*匿名内部类可以为任意接口创建实例,Lambda表达式只能为函数式接口创建实例
*匿名内部类可以为抽象类甚至普通类创建实例,Lambda表达式只能为函数式接口创建实例
*匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法,但Lambda表达式的代码块不允许调用接口中定义的默认方法
使用Lambda表达式调用Arrays的类方法
枚举类
手动实现枚举类
public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINTER = 4;
类型不安全
没有命名空间
打印输出的意义不明确
枚举类入门
enum关键字,用以定义枚举类
枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类
使用enum定义,非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
枚举类构造器只能使用private访问控制符,省略了构造器控制符则默认使用private修饰
枚举类的所有实例必须在枚举类的第一行显示列出
枚举类默认提供values()方法,可以很方便的遍历所有的枚举值
运行结果:
枚举类的成员变量、方法和构造器
优化
实现接口的枚举类
枚举类可以实现一个或多个接口
包含抽象方法的枚举类