为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼啦一阵风 2019-05-22 23:35:13
看不懂这段数组的赋值代码。publicRemoteControl(){onCommands=newCommand[7];offCommands=newCommand[7];for(inti=0;i{};offCommands[i]=()->{};}}这是啥意思啊?onCommands[i]=()->{};offCommands[i]=()->{};按这样子运行,结果是对的;但如果改成等于null,就会报错,显然“()->{}”并不代表赋空值。
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

()->{}是一个Java8的新特性:lambda表达式。
命令模式在Java8以前的实现是类似这样的:
pulicinterfaceCommand{
voiddoCommand();
}
这种单方法的接口,在Java8里允许使用简洁的lambda表达式来描述,如果这个方法有参数,比如:
publicinterfaceCommand{
voiddoCommand(intarg1,intarg2);
}
那么,就可以用(arg1,arg2)->{System.out.println(arg1+arg2);}来描述一个接口的实现。
这是函数式编程的一种体现,你可以多了解一下Java8这方面的新特性。
所以回过头来说,()->{}表示的是,实现了某个接口的空参、啥都不干的接口实例。具体实现的是哪个接口取决于onCommands的类型声明。
so,你这个例子里意思就是:创建两个数组,分别是开启时要执行的命令、关闭时要执行的命令,数组长度为7;为了初始化,避免空指针,为这两个数组赋值啥都不干的接口实例是最合适的。
                            
查看完整回答
反对 回复 2019-05-22
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

这里涉及到lambda表达式的问题。先参考一下这篇文章和这篇文章,了解一下什么是lambda表达式。
在JAVA8以后推出了函数式编程,JAVA开始支持函数式参数传递。什么意思呢?就是函数也可以作为一个参数变量进行传递。下面举一个真实的用例来解释一下:
假设现在有一个String数组,我想找到里面名字叫做rale的童鞋:
intfindRale(Listnames){
for(inti=0;iif(names.get(i).equals("rale")returni;
}
return-1;
}
也许我还想要找到里面所有首字母为R的同学,总之,很多类似的操作。
这时候有人想了,既然我需要对数组进行那么多类似的筛选操作,那么为什么我不写一个通用的filter方法,然后传入我想执行的操纵呢?JAVA8表示,完全没有问题。
//这里使用了JAVA8提供的Predicate接口,实现了函数式编程,也可以自定义函数式接口
//这一段代码相当于将(n)->n.equalsTo("Rale")方法赋值给sum
Predicatesum=(n)->n.equalsTo("Rale");
filter(names,sum);
//将数组以及想要传递给数组的操作作为参数丢入filter方法中
publicstaticvoidfilter(Listnames,Predicatecondition){
for(Stringname:names){
if(condition.test(name)){
System.out.println(name+"");
}
}
}
当然了,在函数式编程推出后,JAVA也提出了更多更加精炼的写法,这里就不一一赘述。
现在我们回到你题目中的这段代码。Command就是一个函数式的接口,它可以被方法赋值。在这里onCommands和offCommands都被初始化空函数()->{}。如果后序有一个operate(Objecto,Commandc)方法,就可以直接传入Command对象,从而直接在o上执行相应的操作。
其实函数式编程和面向对象的编程思想是有冲突的。理解起来还要稍微转变一下思路。
                            
查看完整回答
反对 回复 2019-05-22
  • 2 回答
  • 0 关注
  • 285 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信