为什么大多数语言都不支持LINQ机制?
C# 3.0可以说是C#历史上最大的一次改动,从语言到库的层面可以说是做了革命性的变化,单单是上下文关键字,就一次性新增了from、where、select、group、by、join、equals、on、let、order、into、asscending、descending一大堆,加上原有的in啥的。这特么就是重新设计了一个新的语言。
而C#为了支持LINQ Expression,从语言到库都是进行了一系列的改造:
为了解决select投影出一个新的元组的问题,引入了匿名对象。
为了解决查询条件直接编写在表达式里面的问题,引入了lambda表达式。
为了解决在现有集合上新增查询功能,引入了扩展方法。
为了解决内置集合查询问题,引入了Enumerable扩展类。
为了解决分组聚合问题,引入了IGrouping、ILookup和一系列聚合方法
为了解决INNER JOIN和OUTER JOIN,引入了GroupJoin、FirstOrDefault等一系列扩展方法
为了解决CROSS JOIN,引入了SelectMany
为了解决排序问题,引入了OrderBy和OrderByDescending
为了解决扩展方法查询不好看的问题,引入了上面所说的一大堆关键字和LINQ Expression。
为了解决LINQ查询映射为数据库查询的问题,引入了ExpressionTree(C#历史上最重要的特性)。
为了解决C#没有alias或者immutable value的问题,甚至还增加了let表达式
…………
Java在Java 8一口气抄了Lambda表达式和接口默认实现(解决扩展方法问题),但是没有元组的替代品。就算最新的Java已经支持了record类型,但是匿名类型和元组并不需要事先命名,所以仍然无法写出流畅的select,更何况因为Java没有值类型的泛型(基因问题),所以一些很简单的表达式也会困难重重。
至于最近被吹上天的StringTemplate用来写SQL。
我在八年前就特么用C#的模板字符串实现了……更别说十五年前的LINQ……
======================================================
pizzacompiler.sourceforge.net这是scala作者马丁奥德斯基和haskell类型类的作者Phil Wadler在1996年给java做的方言,把泛型、高阶函数、模式匹配带到了java上,这个东西就是后来java5和java8的前身。
只能说,Java目前的程序员的水准的确是越来越差了,本不想回应这种言论,但想想,还是有一个问题我们一起讨论一下:
事实上你在目前流行的程序设计语言中随便挑一个出来,你说这个语法是不是它独创的?这几乎是不可能的事情,类似的语法或者特性必然在其他语言中出现过。毕竟设计一个程序设计语言在很多学校是毕业前要做的一个功课。
那么,我们凭什么说,Java8的这个特性就是抄C#的呢?
为什么不能说,这位仁兄说的pizza不是被C#抄袭了呢?
我们不妨来考虑这样一个言论:
LINQ不就是抄的SQL的语法么?
我想不会有太多人认同这种说法。要不然我们回到提问者的问题,对啊,就是抄SQL的语法,你倒是抄啊,为啥你不抄呢?
所以,我们谈到一个语言特性的时候,我们说其它语言中的类似特性到底多大程度上受到这个语言影响的时候。
我认为要看三个方面:开创性、实用性、普及性。
开创性毋庸多言,即这个特性是第一次出现在这个语言中,可能是语法形式,可能是概念,可能是用法,可能是搭配。但正如上面说的,事实上很少有语言会有完全的开创性。
实用性即是指这个特性有非常实用的场景,任何语言特性都不是凭空出现的,必然是为了解决具体的问题,那么这些问题就必然有具体的场景。如果一个特性不解决任何实际的问题,没有具体的应用场景,那么这个特性和每年都被创造出来的成千上万的语言一样毫无价值。
普及性也无须多言,正如同我之前说的,目前流行的程序语言都有一个共同的特征就是运气好,运气本来就是语言流行的很重要的一个点。一个特性在某个语言具备开创性也有实用性,但是这个语言运气不好,没有普及开来,那也不会被人记住。
了解了这三点,我们来看为什么我们可以说Java8就是抄的C#。
很简单,我们看看Java8除了加入Lambda之外还加入了哪些东西不就知道了吗?
我们看看Lambda主要的应用场景是什么不就知道了吗?
当然你要是Java搞多了致盲,
您说的对……
全世界都是抄的JVM的。
按照这种逻辑,我还说Java抄的COM呢,那个Object就是IUnknow