java8 新特性
主要方面
- Lambda 表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)
- 方法引用:提供了非常有用的语法,可以直接引用已有java类或对象(实例)的方法或构造器。与 Lambda联合使用,方法引用可以使语言的构造更加紧凑简洁,减少冗余代码。
- 默认方法:默认方法就是一个在接口里有了一个实现的方法。
- Date Time Api:加强对日期和时间的处理
- Optional类:该类已经是java8类库中的一部分,主要解决空指针异常。
关于 Lambda 表达式
Lambda表达式,也可称为闭包。它允许函数作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda表达式可以使代码变得更加简洁紧凑
语法
(parameters)-> expression
(parameters)-> { statements }
lambda表达式的重要特征
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数必须定义圆括号
- 可选大括号:如果主体包含一个语句,则不需要大括号
- 可选的返回关键字:如果主体只有一个表达式 ,返回值则会自动返回值,大括号需要定义指定表达式返回了一个数值。
示例
// 不需要参数,返回值为 5
() -> 5
// 接收一个参数,返回其2倍
x -> x*2
// 接收2个参数,返回他们的差
(x,y) -> x-y
// 接收两个int型整数,返回他们的和
(int x,int y) -> x+y
// 接收一个string对象,在控制台打印,不返回任何值(看起来像是返回 void)
(String x) -> System.out.print(x)
需要注意的点
- Lambda 表达式主要用来定义行内执行的方法类型的接口,例如一个简单方法接口。
- Lambda 表达式免去了使用匿名方法的麻烦,并且给予了java简单但是强大的函数化的编程能力。
- Lambda 表达式只能引用标记了 final 的外层局部标签。即不能在 Lambda 内部修改定义在域外的局部变量。
- Lambda 表达式本是对存在单一方法接口的实现的简化版,是为了使代码更加简洁。是一个匿名函数
示例
// 使用 java 7 排序
private void sortUsingJava7(List<String> names){
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
}
// 使用 java 8 排序
private void sortUsingJava8(List<String> names){
Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
}
interface student{
public void say();
}
Student student = new Student() {
@Override
public void say() {
System.out.println("学生");
}
};
// 等价
Student student1 = ()->System.out.println("学生");