概念
在这一篇中出现了Lambda表达式和Stream玩游戏学编程(1)-猜数字, 它们在Java应用开发中现已成为常用的开发技术, Lambda表达式这玩艺在函数式编程语言如Ruby、JavaScript、Python中早已存在,Java只是把他们学了过来。你可以把Lambda表达式看作是一种匿名功能,也就是没有名称的方法,可以认为lambda它是一块代码,我们在使用时可以将这块代码传递出去,这样它后续可以执行一次或多次,如果你了解过匿名类,那么对Lambda的写法就不会感到太生涩。
Java中没有函数类型,如果要实现Lambda表达式就得将函数表达为对象,也就是实现了特定接口的类的实例,当然你先得对面向对象中的接口以及实现有一些经验。
简单的使用
任务:对一个数组进行排序,调用数组排序函数Arrays.sort(), 使用Lambda表达式自定义排序方式
默认排序方式
1
2
3
4
5int[] a = {3,21,4,99,32,87,9};
Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+",");
}输出排序结果:3,4,9,21,32,87,99, 如果我们需要控制比较结果,比如说从大到小排列,就必须自定义比较逻辑,这个比较逻辑需要实现一个接口Comparator, 这个接口称为函数式接口,而且这个接口只有一个抽象方法compare, 代码如下:
1
2
3
4
5
6
7
8
9
10
11private static class ComparatorNumber
implements Comparator<Integer> {
public int compare(Integer m, Integer n) {
if(m>n) {
return -1;
}
return 0;
}
}1
2
3
4
5
6
7
8Integer[] ary = {3,21,4,99,32,87,9};
//创建比较对象
ComparatorNumber comparatorNumber = new ComparatorNumber();
//第二个参数为自定义比较对象
Arrays.sort(ary, comparatorNumber);
for (int i = 0; i < ary.length; i++) {
System.out.print(ary[i]+",");
}ComparatorNumber类的compare方法为比较方式的实现
使用Lambda表达式
上面的代码可以直接换成lambda表达式的方式,更简洁, 可以把它称为箭头函数,具体的语法如下:
1
(参数1, 参数2) -> { 函数实现 }
如果只有一个参数,语法还可以是下面这样:
1
形参1 -> {函数实现}
如果没有函数的实现只有一个返回代码,还可以用下面这种写法:
1
形参1 -> 返回的变量
比较函数的改造如下, 上面创建的比较类就不需要了 :
1
2
3
4
5
6Arrays.sort(ary, (m,n)->{
if(m>n) {
return -1;
}
return 0;
});如果希望一个接口成为函数式接口,只需要这个接口中仅有一个抽象方法即可
如果对sort方法的第二个参数已有实现的代码,我们也可以直接拿过来使用, 下面的代码就是直接使用了Integer的比较方法compareTo,只是它的比较方式是从小到大,使用方法如下:
1
Arrays.sort(ary,Integer::compareTo);
Java 类库中有很多这样的接口,比如多线程中的Runnable接口, 那么对于玩游戏学编程(1)-猜数字这篇中的如下代码应该就能理解了,按钮的事件监听器对象本身也需要实现一个接口EventHandler, 并且此接口仅有一个抽象方法,此时可以使用Lambda表达式
1
2
3
4
5
6
7
8
9
10
11
12private static class ButtonLis implements EventHandler<ActionEvent> {
public void handle(ActionEvent event) {
}
}
button.setOnAction(new ButtonLis());
//忽略上面的代码,直接使用Lambda表达式
Button button = new Button("开始");
button.setOnAction(e->startGame());//开始按钮事件,startGame()是具体的实现