CommonTemplate(
http://www.commontemplate.org)最近实现了简单的lambda表达式功能,但操作符语法未定,
可选方案:
1.仿Python,采用“lambda”
如:list[lambda i : i > 0]
符合标准lambda表达式定义格式,但太复杂,不简洁。
2.仿JavaFX,采用“|”
如:list[i | i > 0]
但因为“|”已作为“按位或”运算符,重载操作符优先级可能不对,也易引起歧义。
3.仿C#,采用“=>”
如:list[i => i > 0]
4.隐式变量,也就是规定死命名,假设用“index"
如:list[index > 0]
另外,还需要考虑多个参数的情况:
如:list[item,index | item ~ "[0-9]+" && index > 3]
或:list[item,index => item ~ "[0-9]+" && index > 3]
哪种更合理?最符合思维习惯?
或者还有其它方案?
还有一个问题是,现有方案,与lambda表达式功能重叠,如:
现在的方案:
list[1]
list[-1]
list[1..2]
list["value"] // 假设list中放的String对象
list[name="james",role="admin"] // 假设list中放的User对象
用lambda表达式一一替换上面的方案:
(假设采用第4种方案,隐含变量:item,index,size)
list[index == 1]
list[index == size - 1]
list[index >= 1 && index <= 2]
list[item == "value"]
list[item.name == "james" && item.role="admin"]
当然,lambda表达式可以表示更多情况,因为表达式的逻辑完备性很强。
但原方案更直观,简洁。
两者都保留?
更深一步的问题是,现在的lambda表达式表达式是超简化的,
是否应该实现内递归推演?
也就是先前这篇blog所讲的:
http://javatar.iteye.com/blog/137037
如果你不太理解lambda表达式,你可以把它简单的看成匿名的回调函数,
而上面讨论的是一个过滤器功能的回调函数,可以类比:File.listFiles(new FileFilter())
list[lambda item,index,size : index > 0]
相当于list回调了一个匿名函数,参数列表为item,index,size,
返回值为index > 0,list根据返回值确定要不要接收这个项。
Java等价写法:
subList = list.sub(new Filter() {
public boolean filter(Object item, int index, int size) {
return index > 0;
}
});