Headfirst 设计模式里面的 命令模式 中的有关数组赋值代码

看不懂这段数组的赋值代码。

public RemoteControl() {
    onCommands = new Command[7];
    offCommands = new Command[7];

    for (int i = 0; i < 7; i++) {
        onCommands[i] = () -> { };
        offCommands[i] = () -> { };
    }
}

这是啥意思啊?

        onCommands[i] = () -> { };
        offCommands[i] = () -> { };

按这样子运行,结果是对的;
但如果改成 等于null,就会报错,显然“() -> { }”并不代表赋空值。

阅读 2.2k
2 个回答

() -> {} 是一个 Java 8 的新特性:lambda 表达式。

命令模式在 Java 8 以前的实现是类似这样的:

pulic interface Command {
    void doCommand();
}

这种单方法的接口,在 Java 8 里允许使用简洁的 lambda 表达式来描述,如果这个方法有参数,比如:

public interface Command {
    void doCommand(int arg1, int arg2);
}

那么,就可以用 (arg1, arg2) -> { System.out.println(arg1 + arg2); } 来描述一个接口的实现。

这是 函数式编程 的一种体现,你可以多了解一下 Java 8 这方面的新特性。

所以回过头来说,() -> {} 表示的是,实现了某个接口的空参、啥都不干的接口实例。
具体实现的是哪个接口取决于 onCommands 的类型声明。

so,你这个例子里意思就是:
创建两个数组,分别是开启时要执行的命令、关闭时要执行的命令,数组长度为7;
为了初始化,避免空指针,为这两个数组赋值 啥都不干接口实例 是最合适的。

这里涉及到lambda表达式的问题。先参考一下这篇文章这篇文章,了解一下什么是lambda表达式。

在JAVA8以后推出了函数式编程,JAVA开始支持函数式参数传递。什么意思呢?就是函数也可以作为一个参数变量进行传递。下面举一个真实的用例来解释一下:

假设现在有一个String数组,我想找到里面名字叫做rale的童鞋:

int findRale(List<String> names){
    for(int i = 0 ; i<names.length ; i++){
        if(names.get(i).equals("rale") return i;
    }
    return -1;
}

也许我还想要找到里面所有首字母为R的同学,总之,很多类似的操作。

这时候有人想了,既然我需要对数组进行那么多类似的筛选操作,那么为什么我不写一个通用的filter方法,然后传入我想执行的操纵呢?JAVA8表示,完全没有问题。

//这里使用了JAVA8提供的Predicate接口,实现了函数式编程,也可以自定义函数式接口
//这一段代码相当于将 (n) -> n.equalsTo("Rale") 方法赋值给sum
Predicate<String> sum = (n) -> n.equalsTo("Rale");
filter(names, sum);

//将数组以及想要传递给数组的操作作为参数丢入filter方法中
public static void filter(List names, Predicate condition) {
    for(String name: names)  {
        if(condition.test(name)) {
            System.out.println(name + " ");
        }
    }
}

当然了,在函数式编程推出后,JAVA也提出了更多更加精炼的写法,这里就不一一赘述。

现在我们回到你题目中的这段代码。Command就是一个函数式的接口,它可以被方法赋值。在这里onCommandsoffCommands都被初始化空函数() -> { }。如果后序有一个operate(Object o, Command c)方法,就可以直接传入Command对象,从而直接在o上执行相应的操作。

其实函数式编程和面向对象的编程思想是有冲突的。理解起来还要稍微转变一下思路。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题