玩游戏学编程(1)-猜数字-Lambda

概念

在这一篇中出现了Lambda表达式和Stream玩游戏学编程(1)-猜数字, 它们在Java应用开发中现已成为常用的开发技术, Lambda表达式这玩艺在函数式编程语言如Ruby、JavaScript、Python中早已存在,Java只是把他们学了过来。你可以把Lambda表达式看作是一种匿名功能,也就是没有名称的方法,可以认为lambda它是一块代码,我们在使用时可以将这块代码传递出去,这样它后续可以执行一次或多次,如果你了解过匿名类,那么对Lambda的写法就不会感到太生涩。

Java中没有函数类型,如果要实现Lambda表达式就得将函数表达为对象,也就是实现了特定接口的类的实例,当然你先得对面向对象中的接口以及实现有一些经验。

简单的使用

任务:对一个数组进行排序,调用数组排序函数Arrays.sort(), 使用Lambda表达式自定义排序方式

  1. 默认排序方式

    1
    2
    3
    4
    5
    int[] 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
    11
    private static class ComparatorNumber 
    implements Comparator<Integer> {

    @Override
    public int compare(Integer m, Integer n) {
    if(m>n) {
    return -1;
    }
    return 0;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    Integer[] 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方法为比较方式的实现

  2. 使用Lambda表达式

    上面的代码可以直接换成lambda表达式的方式,更简洁, 可以把它称为箭头函数,具体的语法如下:

    1
    (参数1, 参数2)  -> { 函数实现 }    

    如果只有一个参数,语法还可以是下面这样:

    1
    形参1 -> {函数实现}

    如果没有函数的实现只有一个返回代码,还可以用下面这种写法:

    1
    形参1 -> 返回的变量

    比较函数的改造如下, 上面创建的比较类就不需要了 :

    1
    2
    3
    4
    5
    6
    Arrays.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
    12
    private static class ButtonLis  implements EventHandler<ActionEvent> {
    @Override
    public void handle(ActionEvent event) {

    }
    }

    button.setOnAction(new ButtonLis());

    //忽略上面的代码,直接使用Lambda表达式
    Button button = new Button("开始");
    button.setOnAction(e->startGame());//开始按钮事件,startGame()是具体的实现