目录
一、Lambda表达式
1.1 概念
1.2 特点
1.3 基本语法
1.3.1 lambda表达式的重要特征
二、方法引用
2.1 使用形式
三、 默认方法
一、Lambda表达式
1.1 概念
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。可以使代码变的更加简洁紧凑。
1.2 特点
1)更加紧凑的代码:Lambda表达式可以通过省去冗余代码来减少我们的代码量,增加代码的可读性;
2)更好的支持多核处理:Java1.8中通过Lambda表达式可以很方便地进行操作大集合,充分发挥多核CPU的潜能,并行处理函数如filter、map和reduce;
3)改善我们的集合操作:Java1.8 引入 Stream API,可以将大数据处理常用的 map、reduce、filter 这样的基本函数式编程的概念与 Java 集合结合起来。方便我们进行大数据处理。
1.3 基本语法
(参数列表)-> {代码块}
1.3.1 lambda表达式的重要特征
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
(参数列表)-> {代码块}
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
1.3.2 lambda表达式实例
public class Lambda {
public static void main(String []args){
Lambda l=new Lambda();
String some="I am Lambda";
String some1="我是匿名内部类";
Print p=(String a)->{System.out.println(a);}; //lambda表达式
l.printer(some, p);
l.printer(some1, p1);
}
interface Print{ //定义一个接口
void print(String a); //抽象方法
}
public void printer(String some,Print pr){ //定义一个方法来实现Print接口
pr.print(some); //调用Print接口里的方法
}
static Print p1=new Print(){ //匿名内部类
public void print(String a) {
System.out.println(a);
}
};
}
输出结果为:
在这个例子中可以看出,lambda表达式的代码比匿名内部类的代码简洁了好多,都是实现相同的接口。
二、方法引用
方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码 方法方法引用是一个更加紧凑,易读的Lambda表达式。
方法引用使用一对冒号 :: 。
2.1 使用形式
- 构造器引用 类名::new
- 静态方法引用 类名::静态方法名
- 特定类的任意对象的方法引用类名::实例方法名
- 特定对象的方法引用 对象实例名::实例方法名
这里只使用静态方法的引用,其它的引用形式,感兴趣的话,可以自行百度学习。
public class MethodReference {
public static void main(String args[]){
List names = new ArrayList(); //new一个List集合
names.add("Google"); //添加元素
names.add("Runoob");
names.add("Taobao");
names.add("Baidu");
names.add("Sina");
names.forEach(System.out::println);
//利用forEach方法遍历输出List集合中的元素
//将System.out::println 方法作为静态方法来引用。
}
}
输出结果为:
三、 默认方法
Java 8 新增了接口的默认方法。
简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个 default 关键字即可实现默认方法。
public interface Vehicle {
default void print(){
System.out.println("我是一辆车");
}
static void on(){
System.out.println("启动");
}
}
public interface FourWheeler {
default void print(){
System.out.println("我是一辆四轮车");
}
}
public class Car implements Vehicle,FourWheeler{
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.on();
}
}
public class DefaultMethod{
public static void main(String[] args){
Vehicle vehicle=new Car();
vehicle.print();
}
}
输出结果为:
通过上面的例子,接口可以声明(并且可以提供实现)静态方法;如果一个类只实现了一个拥有默认方法的接口时,不用重写默认方法;如果一个类实现了多个接口,且这些接口有相同的默认方法,那么必须要重写默认方法或者使用 super 来调用指定接口的默认方法。



