Java 8的Streams API和.Net的LINQ使用上最大的不同是什么?

关注者
202
被浏览
61,187

10 个回答

完整的LINQ分以下几部分,缺一不可:

  1. Lambda Expression
  2. Query Expression
  3. Extension Methods
  4. Expression Tree
  5. Anonymous Types

Java除了第一个后面都没有。你可以认为Java的Streams API是一个:

  1. 无法用Monad形式(没有Query Expression)
  2. 难以扩展的(没有Extension Methods)
  3. 无法表达语句结构及动态编译函数(没有Expression Tree)
  4. 无法借助临时结构减少计算或增强表达能力(没有Anonymous Types)

的LINQ。

此外,这套API不是加在标准的Iterator和Iterable模型上的(在C#叫IEnumerator和IEnumerable),导致又多了一套Streams模型出来,而又和IO的Stream容易产生混淆,真不知道设计者是怎么想的,搞个Extension Methods出来多好,不光对LINQ有用,简直方便之至。

总而言之,Java 8这套给我的感觉就是因为不愿意搞出和C#一样的设计而引入的半吊子东西。当年Lambda表达式的草案是和C#以及Scala一样使用“=>”符号的,结果最后硬要改为“->”真是生怕别人不知道要故意跟C#不同。

作为一个C#程序员,我从不讳言C#早期很多特性都是从Java借鉴过来的,这些特性中也有许多与Java并不相同,例如显示的virtual和override、废弃throws、final->sealed,const,delegate支持等等等等。

这些不同之处,最终都被证明了是Java的痛处。


从C# 2.0开始,Java和C#都引入了泛型支持,然后差距开始变大。在泛型支持上两者语法一致而实现上Java却被C#完爆。更别说2.0引入的匿名方法了,匿名方法可以视为是一种啰嗦点的lambda表达式,因为匿名函数啊、闭包啊这些特性全都支持了。


再到今天的LINQ,,,,

我只想说:语言特性连抄都抄得这么丑,还真是难为设计者了


顺便说一下,虚机平台+多语言支持也是.NET最先搞的,说白了这个也是Java抄.NET的。当年.NET宣布多语言策略的时候,Java党说的是那么多语言学不过来,不像Java学好一个走遍天下都不怕,23333,,,,