JDK8——Lambda表达式
开始之前我们先介绍一下“函数式编程”,什么是“函数式编程”,就是把一个方法或者一个函数作为参数传递,这在JDK8之前是做不到的,但是我们也许经常在 javascript 中看到这样的操作,如下:
<script type="text/javascript">
window.onload = test();
function test() {
setInterval(function(){
console.log("执行匿名函数——" + new Date());
},1000);
setInterval(() => {
console.log("执行箭头函数");
}, 1000);
}
</script>
这段JS代码中,第一个setInterval函数会每隔1秒执行参数中传递的匿名函数,第二个setInterval函数同理,这也是ES6中的箭头函数,即马上要学习的Lambda表达式
JDK8的Lambda表达式
以比较器为例:
public class TestLambda {
@Test
public void testLambda() {
List<Integer> nums = new ArrayList<>();
nums.add(8);
nums.add(3);
nums.add(5);
nums.add(1);
nums.add(7);
nums.add(6);
// 传统匿名内部类的方式
Collections.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return i1 - i2;
}
});
System.out.println(nums);
}
}
传统排序器输出结果:[1, 3, 5, 6, 7, 8]
这里我们使用传统的匿名内部类的方式,传一个排序器对象进去排序。可以看出来我们java的面向对象的思想,实质还是对象的传递。
使用Lambda表达式改造上面的代码
public class TestLambda {
@Test
public void testLambda() {
List<Integer> nums = new ArrayList<>();
nums.add(8);
nums.add(3);
nums.add(5);
nums.add(1);
nums.add(7);
nums.add(6);
// Lambda表达式书写比较器
Collections.sort(nums, (i1,i2)->{ return i1-i2; });
System.out.println(nums);
}
}
Lambda表达式书写排序器输出结果:[1, 3, 5, 6, 7, 8]
Lambda表达式只能表示函数接口,函数接口就是只有一个方法的接口,例如Runnable接口,Comparator接口等。
Lambda表达式语法
如:(i1,i2)->{ return i1-i2; }
( )开头,( )中写函数接口的方法形参名,然后写 -> 箭头符 ,最后一个{ },{ }中写代码块
注意:如果函数接口中的方法有参数,并且参数类型不是泛型,那么()中直接写参数名,
如果函数接口中的方法参数类型是泛型,那么()中需要指明类型,如(Integer i)