JAVA8新特性1——Lambda表达式
下面用一个代码来初体验lambda表达式的使用
import java.util.Arrays;
import java.util.Comparator;
public class LambdaDemo1 {
public static void main(String[] args) {
Integer[] arr = {2,3,4,5,6,7,1,3,2};
//第一种写法
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
//第二种写法:lambda表达式的写法
Arrays.sort(arr,(Integer o1, Integer o2) -> {
return o1 - o2;
}
);
System.out.println(Arrays.toString(arr));
}
}
从上面的代码我们可以看出lambda的一个很大的优点就是代码简洁。lambda表达式是函数式编程思想的一种应用
函数式编程
- 可以把函数作为参数传递给另一个函数
- 可以返回一个函数,这样就可以实现闭包或者惰性计算
面向对象
先找对象,让对象做事情,采用面向对象编程时,我们往往需要先创建一个对象,再调用对应类的方法
二者的区别
数据存放方式
1、对于OO(面向对象,下同),数据存放在对象的属性(成员变量)里面,以及静态成员(全局变量)
2、对于函数式,数据存放在闭包(各级作用域)里面,作用域包括全局作用域。
数据访问方式
数据存放方式决定了访问的方式。
1、对于OO来说,访问数据(全局变量除外)需要先获取对象的引用,然后再进行操作(直接访问——公共属性,或者调用成员函数/方法访问——私有属性)
2、对于函数式,访问数据是直接访问(通过函数入参或者作用域链查找)
Lambda表达式的注意点
- lambda表达式可以用来简化匿名内部类的书写
- lambda表达式只能简化函数式接口的匿名内部类的方法
- 函数式接口:有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以加
@FunctionalInterface
注解
lambda改写函数式接口的匿名内部类实现
import java.util.Arrays;
import java.util.Comparator;
public class LambdaDemo2 {
public static void main(String[] args) {
//1.利用匿名内部类的形式去调用下面的方法
//调用一个方法的时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象
//如果实现类对象只要用到一次,就可以用匿名内部类
//method括号里面是一个实现了Swim接口的对象 即Swim接口的实现类对象
method(new Swim() {
@Override
public void swimming() {
System.out.println("正在游泳");
}
});
//2.利用lambda表达式进行改写
method(
()->{ //因为swimming方法没有参数,所以括号为空
System.out.println("正在游泳");
}
);
}
public static void method(Swim s){
s.swimming();
}
}
interface Swim{
public abstract void swimming();
}
lambda写法掌握:只关注方法体,不关心方法的名字和对象,形参和方法体之间加上->
总结
- lambda表达式的基本作用:简化函数式接口的匿名内部类的写法
- lambda表达式有什么使用前提:必须是接口的匿名内部类,接口中只能有一个抽象方法
- lambda的好处:
lambda表达式是一个匿名函数,不需要创建对象就可以直接写出方法体,可以理解为是一段可以传递的代码,可以写出更简洁、更灵活的代码
lambda表达式的省略写法
省略核心:可推导,可省略
省略规则
- 参数类型可省略
- 如果只有一个参数,参数类型可省略,同时()可以省略
- 如果lambda表达式的方法体只有一行,大括号、分号、return可以省略不写,三者需要同时省略
import java.util.Arrays;
import java.util.Comparator;
public class LambdaDemo1 {
public static void main(String[] args) {
Integer[] arr = {2,3,4,5,6,7,1,3,2};
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
//下面是lambda表达式的写法
Arrays.sort(arr,(Integer o1, Integer o2) -> {
return o1 - o2;
}
);
//下面是lambda表达式的省略写法
Arrays.sort(arr,(o1,o2) -> o1 - o2);
System.out.println(Arrays.toString(arr));
}
}