Java零基础自学DAY10 2018-03-22

Java 8 新增的lambda表达式


Java零基础自学DAY10 2018-03-22_第1张图片

Lambda 转换:

Java零基础自学DAY10 2018-03-22_第2张图片

Lambda表达式组成:

形参列表

箭头 ( ->) 必须通过英文中画线和大于符号组成

代码块,如果只有一条语句,Lambda表达式允许省略花括号

Lambda简化写法


Java零基础自学DAY10 2018-03-22_第3张图片

Lambda表达式与函数式接口

Lambda表达式的类型也称为目标类型,其必须是函数式接口(只包含一个抽象方法的接口)

Lambda表达式进行赋值:

Lambda表达式的目标类型必须是明确的函数式接口

Lambda表达式只能为函数式接口创建对象,Lambda表达式只能实现一个方法,只能为只有一个抽象方法的接口创建对象

Java零基础自学DAY10 2018-03-22_第4张图片

为保证Lambda表达式的目标类型是一个明确的函数式接口:

*将Lambda表达式赋值给函数式接口类型的变量

*将Lambda表达式作为函数式接口类型的参数传给某个方法

*使用函数式接口对Lambda表达式进行强制类型转换

方法引用和构造器引用

Java零基础自学DAY10 2018-03-22_第5张图片

Lambda表达式与匿名内部类的联系和区别

Lambda表达式与匿名内部类一样,都可以直接访问effectively final的局部变量,以及外部类的成员变量

Lambda表达式创建的对象和匿名内部类生成的对象一样,都可以直接调用从接口中承接的默认方法

Lambda表达式匿名内部类的主要区别:

*匿名内部类可以为任意接口创建实例,Lambda表达式只能为函数式接口创建实例

*匿名内部类可以为抽象类甚至普通类创建实例,Lambda表达式只能为函数式接口创建实例

*匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法,但Lambda表达式的代码块不允许调用接口中定义的默认方法

使用Lambda表达式调用Arrays的类方法

Java零基础自学DAY10 2018-03-22_第6张图片

枚举类

手动实现枚举类

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()方法,可以很方便的遍历所有的枚举值

Java零基础自学DAY10 2018-03-22_第7张图片

运行结果:


枚举类的成员变量、方法和构造器


Java零基础自学DAY10 2018-03-22_第8张图片
Java零基础自学DAY10 2018-03-22_第9张图片

优化

Java零基础自学DAY10 2018-03-22_第10张图片

实现接口的枚举类

枚举类可以实现一个或多个接口

Java零基础自学DAY10 2018-03-22_第11张图片

包含抽象方法的枚举类

Java零基础自学DAY10 2018-03-22_第12张图片

你可能感兴趣的:(Java零基础自学DAY10 2018-03-22)