jdk1.8发布时间 :2014-3-18,主要更新了许多新特性,包括但不限于以下几种
1.Lambda表达式
2.接口中的静态方法和默认方法
3.方法引用
4.函数式接口
5.Stream流
等等
1.Lambda表达式:
Lambad表达式体现了函数式编程思想,强调做什么,而不是以什么方式去做,忽略了面向对象的复杂语法,使得编程更简洁。
1.1Lambda表达式的作用
lambda表达式的作用和匿名内部类相似,当一个方法的参数是一个抽象类或者接口时,我们传递的实参应该是该抽象类或者接口的子类实例对象或者实现类对象,此时,我们可以使用匿名内部类代替,如:
//这是一个接口
public interface Eatable {
void eat();
}
public class LambdaDemo {
public static void main(String[] args) {
useEatable(new Eatable() { //这里调用下面的方法,使用匿名内部类做为接口的实现类对象传递
@Override
public void eat() { //重写接口中的方法
System.out.println("吃饭");
}
});
}
//该方法的参数是一个接口,需要的实参是接口的实现类对象
private static void useEatable(Eatable e){
e.eat();
}
}
Lambda的出现可以简化匿名内部类的格式,如:
public class LambdaDemo02 {
public static void main(String[] args) {
//这里使用Lambda表达式做为参数传递
useEatable(()->{
System.out.println("吃东西");
});
}
private static void useEatable(Eatable e){
e.eat();
}
}
//这是一个接口
public interface Eatable {
void eat();
}
上面代码中:useEatable方法需要的参数实一个接口的实现类对象,而接口Eatable中只有一个抽象方法,所以Lambda表达式:()->{ System.out.println("吃东西"); } 相当于重写了Eatable中的抽象方法。
1.2Lambda表达式的标准格式
// 标准格式:
(形参)->{代码块};
// 如果有多个参数,用逗号隔开即可。相当于一个方法
1.3Lambda表达式的省略模式
1.参数类型可以省略,但是有多个参数的情况下,不能只省略一个。
2.如果参数有且仅有一个,那么小括号可以省略
3.如果代码块的语句只有一条,可以省略大括号和分号,如果该语句是return语句,那么return也可以省略
如:
//下面有三个接口
public interface Addable {
int add(int x,int y);
}
public interface Eatable {
void eat();
}
public interface Flyable {
void fly(String s);
}
//测试类
public class LambdaDemo02 {
public static void main(String[] args) {
//无参
useEatable(()-> System.out.println("吃东西"))//省略大括号和分号
//一个参数
useFlyable(s->System.out.println(s)); //省略参数类型,大括号和分号
//二个参数,有返回值
useAddable((x,y)->x + y);//省略参数类型,大括号和分号,以及return关键字
}
private static void useEatable(Eatable e){
e.eat();
}
private static void useFlyable(Flyable f){
f.fly("风和日丽");
}
private static void useAddable(Addable a){
System.out.println(a.add(10,20));
}
}
1.4Lambda表达式的注意事项
1.lambda表达式不能单独使用
2.只有方法的参数类型是一个接口,并且该接口只有一个抽象方法时,才能使用lambda表达式,相当于重写了接口中的抽象方法。
1.5Lambda表达式和匿名内部类的区别:
1.所需类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
2.使用限制不同
如果接口