JDK8新特性笔记(三):Lambda表达式
在JDK8之前, Java是不支持函数式编程的,所谓的函数编程,即可理解是将一个函数(也称为“行为”)作为一个参数进行行传递, 面向对象编程是对数据的抽象(各种各样的POJO类),而函数式编程则是对行为的抽象(将行为作为一个参数进行传递)
新建线程对比:
// 以前的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程名:"+Thread.currentThread().getName());
}
}).start();
// Lambda方式创建线程
new Thread(()->{
System.out.println("线程名:"+Thread.currentThread().getName());
}).start();
Lambda方式创建线程方便简洁。
Collection集合排序对比:
List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
// 以前的方式进行排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
// Lambda方式进行排序
Collections.sort(list,(o1,o2)->o2.compareTo(o1));
// 遍历打印
for (String str:list){
System.out.println(str);
}
同样是倒序排列,lambda表达式的方式虽然简洁但是看起来并没有以前那样清晰明确省略了一些相关的方法名等信息。
Lambda表达式使用前提:一个接口中只包含一个方法,则可以使用Lambda表达式,这样的接口称之为“函数接口”:(params)->expression
参数列表:
括号中参数列表的数据类型可以省略不写
括号中的参数只有一个,那么参数类型和()都可以省略不写
方法体:
如果{}中的代码只有一行,无论对应方法有没有返回值都可以省略{}、return、分号;如果是一整块的代码块的话如果有返回值要求就需要return返回。
好处:
Lambda表达式的实现方式在本质是以匿名内部类的方式进行实现,编写很简洁。
自定义Lambda
- 定义一个函数式接口 需要在接口加注解@FunctionalInterface,否则万一忘了或者其他人加了其他方法可能会导致函数式接口失效
- 编写一个方法,输入需要操作的数据和接口
- 在调用方法是传入数据和lambda表达式,用来操作数据
定义一个接口做四个实现分别为加减乘除,我的理解是在方法内实现接口的简易方式。
/**
* description: OperFunction
* R返回值 T入参<br>
*/
@FunctionalInterface
public interface OperFunction<R,T> {
R operator(T t1,T t2);
}
public class Lambda_Demo01 {
public static void main(String[] args) {
System.out.println(operatorTest(8,9,(x,y)->x+y));
System.out.println(operatorTest(8,9,(x,y)->x-y));
System.out.println(operatorTest(8,9,(x,y)->x*y));
System.out.println(operatorTest(8,9,(x,y)->x/y));
}
// 用作lambda表达式传入方法
public static Integer operatorTest(Integer x,Integer y,OperFunction<Integer,Integer> operFunction){
return operFunction.operator(x,y);
}
}
运行结果:
17
-1
72
0