论坛首页 Java企业应用论坛

lambda表达式语法思考

浏览 4088 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-17  
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;
   }
});
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics