Featured article by oschina reproduced with permission by Data Geekery GmbH.
LINQ一直是.net程序系统中的一个非常棒的东东. Visual Studio 2008 已经引入了lambda 表达式和monads, 而同一时间Java6版本还在讨论要不要去掉泛型数据类型. 这一成果要归功于荷兰计算机科学家Erik Meijer, 他已经全停止掉别的项目.
Erik Meijer. 摄影:Ade Oshineye. 授权给CC-BY-SA Java的现状?
即将要发布的Java8和JSR-355,我们还需要LINQ?在过去的十几年中人们一直在尝试用LINQ给Java带来性能的改良。当时,Quaere和Lambdaj似乎在研究一种很有前途的库(非语言级别). 事实上,StackOverflow上有很多Java的使用者提出的有没有与LINQ等价的Java做法(到现在依然) :
有趣的是, "LINQ"已经发展到EL 3.0版本了! 我们真的需要LINQ么?
LINQ的高级特性存在重大缺陷, 从我们角度看来, 将会导致 "next big impedance mismatch". LINQ来源于SQL,这不是一件完美的事情. LINQ流行的LINQ-to-Objects,在.NET下是一种很好的查询方式.Haskell或Scala的成功已表明,真正的函数式编程可以忽略SELECT,WHERE,GROUP BY, 或者HAVING等来进行集合查询。他们使用"fold", "map", "flatMap", "reduce",来获得更高的性能.另一方面LINQ用 "skip", "take"使用混合式GROUP BY(不是OFFSET和FETCH). 事实上, 没有一种函数式查询方法可以超越那老旧但好用的SQL外部链接, 分组设置,或 框架窗口功能. 这些结构仅仅是一个SQL开发人员希望看到的结果的声明。他们不是自足的功能,这实际上包含在任何给定的情况下被执行的逻辑。此外,窗口功能,可以只用在SELECT和ORDER BY子句,这是一种明显声明方式,但是如果你没有SQL上下文这也是非常奇怪的。具体来说,SELECT子句中的窗口函数采用正确的数据预取影响整个执行计划和索引的方式。
相反,函数式编程可以在内存中就做到SQL的这些功能。使用SQLesque API 进行集合查询是用函数式方式狡猾的欺骗 了"传统"的人。这样的实现方式是不能将集合数据与SQL表查询的数据合并在一起的,也不会产生预期的SQL查询结果。 |