Java 8能否干掉Scala?

最令人期待的Java 8前不久发布,该版本包含很多令人兴奋的新特性,被认为是自Java 5发布以来对Java做出的最大改变。对于开发者而言,最值得注意的特性包括:Lambda表达式/闭包、接口支持静态方法、默认方法、函数式接口、java.util.stream、改善了泛型中对类型推理的支持、java.time以及NashornJavaScript引擎。另外,新版本还移除了PermGen。

而被一部分人认为是Java替代者的Scala则是一门有趣的语言,它一方面吸收并继承了多种语言中的优秀特性,另一方面也没有抛弃Java这个强大的平台,它可以运行在 Java 虚拟机之上,能够轻松地与Java互联互通。与Java不同的是,Scala既支持面向对象的特性,又支持函数式编程,它的风格和特性吸引了大量的开发人员,那么新版本的Java能否借助大量的特性“创新”干掉Scala呢?系统架构师、开源布道者Ahmed Soliman最近在自己的博客上发表了一篇博文表达了自己的看法,同时这篇文章在LinkedIn和Hacker News上也引起了激烈的讨论,下面是笔者摘录的一些观点。

Ahmed Soliman认为:

Java 8新引入的Lambda表达式并不像Scala中的Lambda那么强大,它仅仅触及了Lambda的皮毛。例如,并不是所有函数都可以作为一等元素(first-class)传入其他函数中,函数必须被显式地定义为Lambda表达式或者使用函数式接口。在集合操作方面,借助于新的java.util.stream包,开发人员可以在一些Java集合上编写函数式风格的操作,这和Scala中的方法类似,但是后者更简洁、类型更精确。Java和Scala之间依然有很大的差距,Java并不会变成一门函数式语言,它的目标是企业,同时要保证稳固的向后兼容性;而Scala的目标则是多核软件开发。Java 8向前迈出了伟大的一步,这一点让很多人都非常兴奋,甚至对于Scala程序员也是如此,但是它的目标并不是“干掉”Scala,事实上,这两者应该是一种互补的关系。

来自于Reply 的Stefano S回复说:

Scala在设计上就是函数式,而Java则是被扩展成函数式,在函数式的纯度上这两门语言就不一样,我认为Java 8是否能够取得成功很大程度上取决于JDK的实现情况。如果JDK 8稳固且凝聚性高,那么对Scala而言必然会造成巨大的冲击。如果仅仅需要学习一些新的语法就能利用和其他语言相似的语法及特性,那放弃自己熟悉的语言去学习一门新语言的理由是什么呢?

openForce信息技术的拥有者GesmbH评论说:

Java不可能替代Scala。首先Scala开发非常活跃,设计清晰,目标明确。JDK的开发则比较停滞。很显然,对于Oracle而言按时交付一个新的JDK好像有一些麻烦。所以,我个人对JDK 8在2014年能否包含之前承诺的所有特性持怀疑态度。而就Scala而言,如果一切进展顺利,那么我们可以在今年见到Scala 2.11,该版本会解决很多令人讨厌的问题。其次,JDK类库在设计上就有一些缺陷,要成为一门真正的函数式语言必须要解决这些缺陷,例如集合框架。再就是Java相对于很多其他的语言太过于啰嗦,我使用Java开发了12多年的企业应用,而使用Scala才两年,但是我并不想回到过去。当然Java生态系统非常优秀,JVM也非常伟大,但是Java作为一门语言已经有点过时了。

数据和软件工程师Adam R评论到:

我认为Java 8的函数式功能太少,来得也太迟了。虽然这确实是一个改进,但是距离Scala依然很远。那些真正在乎这些功能的开发人员早就转向了其他的函数式语言。Java 8确实会为Java开发人员带来函数式编程的意识,但是一部分开发人员期望获得更多的特性,而另一部分则根本不在乎。

来自于Cabot Research的软件工程师BrianT认为:

考虑到Java 7给我们带来的灾难,同时鉴于Java 8仅实现了闭包的一部分而其余部分将会在Java 9中实现,我认为Scala根本没必要担心。就是在昨天我们不得不将一台新机器从Java 7回退到Java 6,原因是一些Eclipse插件无法在新版本上工作。Java 8可能会是少数人使用(相对而言)的一门优秀语言。

Eranation在Hacker News上评论说:

作为一个Scala和Java开发者,我甚至没有一点兴趣在下一个项目中放弃Scala转向Java 8。如果只能选择Java,那么最好是Java 8,但是如果有其他选择,我想除了Lambda之外Scala还有很多吸引我的地方。

所有的东西都是表达式,它支持推导式(特别是有多种可能的情况,使用漂亮的语法解决死亡回调三角)、隐式转换、Case类、模式匹配、元组、字符串插入、多行字符串、默认参数、命名参数、类型推断、内置依赖注入,同时所有元素的equals和hashcode方法都已经被正确地实现(可以使用元组甚至是数组作为map的键)。

我认为Scala依然会呆在这里,至少对于Scala开发人员来说是这样的,我非常确定没有任何一个Scala开发人员会说:“Java 8支持Lambda表达式了?非常好,再见Scala!”。我会考虑Java 8只有两个原因,就是编译时间和二进制兼容性。如果忽略掉这两个原因,我只能说Java 8所做的这一切恰好证明了Scala正走在正确的路上。

我确实希望Scala能够提升它与Java 8的互操作性,例如用同样的方法支持函数式接口,向Java 8集合中添加新的隐式转换等。如果有一门语言具备Scala的所有功能,同时做的比Scala更好,那么我会毫不犹豫的使用它。但是到目前为止我还没发现有这样一门语言(当然,我需要的是基于JVM的语言,同时最好是一门静态类型的语言,所以选择余地并不是很广)。Java 8有非常大的提升,我很高兴Java开发人员能够使用这些特性,但是这并不是让大家考虑从Scala转向Java的原因

文章相关课程 Java开发实用工具及组件应用(JFreeChart、PDF组件-iText、jasper report报表、Maven) 基于JavaEE平台实战WebService框架Xfire+Ajax框架DWR(租房网项目实战) 基于ibatis、spring、struts2.0技术实战开发企业级ERP进销存管理项目(权限、Ajax、Jquery)

时间: 2024-10-25 19:52:22

Java 8能否干掉Scala?的相关文章

Java 下一代: Groovy、Scala 和 Clojure 中的共同点(三)

反思异常.表达式和空 在 上一期文章 中,我介绍了 Java 下一代语言用来消除 Java 语言中华而不实的东西和复杂性的创新方式.在这一期 文章中,我将展示这些语言如何消除 Java  的一些瑕疵:异常.语句与表达式,以及围绕 null 的边缘情况. 表达式 Java  语言从 C 语言那里继承的一项传承是区分编程语言 和编程表达式.Java 语句的示例包 括使用 if 或 while 的代码行,以及使用 void 来声明不会返回任何值的方法的代码行.表达式(比如 1 + 2 )用于求取 某一

写给Java老司机的Scala教程——Scala Fast Track

引子 如果说有什么编程语言让我觉得收获颇大的话,我想除了 Java 那么另一个就是 Scala,Java 教会了我工程和严谨,而 Scala 则进一步的给了我耳目一新的思维模式,并提高了我对OOP的认识,反过来,Scala的习得,也让我成为了一个更好的Java程序员. 背景 我写这个系列教程,除了分享我自己学习Scala的一些心得体会之外,并不是要特别的安利大家Scala.而我其实比较愚钝,所以我学习Scala 的时候走了不少弯路,记得当时还是 Scala 2.10,然后各种学习资料不是特别完善

Java 下一代: Groovy、Scala 和 Clojure 中的共同点(一)

探究这些下一代 JVM 语言如何处理操作符重载 编程语言中的好理念可以延续并扩展到其他语言,就像美酒一样历久弥香.因此,不足奇怪的是,Java 下一代语言 - Groovy.Scala 和 Clojure - 具有很多共同的特性.在本期和下一期 Java 下一代 文章中,我将探讨每种语言语法中功 能清单的一致性.我从能够重载操作符这个特性说起  - 克服了Java 语言中长期存在的一个缺点. 操作符重 载 如果您改造过 Java BigDecimal 类,可能看到过类似于清单 1 的代码: 清单

Java 下一代: Groovy、Scala 和 Clojure 中的共同点(二)

了解Java 下一代语言如何减少样板代码和降低复杂性 Java 编程语言诞生时所面临的限制与如今的开发人员所面临的条件有所不同.具体来讲,由于上世纪 90 年代中期的硬 件的性能和内存限制,Java 语言中存在原语类型.从那时起,Java 语言不断在演化,通过自动装箱(autobox)消除了许 多麻烦操作,而下一代语言(Groovy.Scala 和 Clojure)更进一步,消除了每种语言中的不一致性和冲突. 在这 一期的文章中,我将展示下一代语言如何消除一些常见的 Java 限制,无论是语法上

面向Java开发人员的Scala指南

在撰写本文时,夏季即将结束,新的学年就要开始,Twitter 的服务器上不 断涌现出世界各地的网虫和非网虫们发布的更新.对于我们很多身在北美的人来 说,从海滩聚会到足球,从室外娱乐到室内项目,各种各样的想法纷至沓来.为 了跟上这种形势,是时候重访 Scitter 这个用于访问 Twitter 的 Scala 客户 机库了. 如果 到目前为止 您一直紧随 Scitter 的开发,就会知道,这个库现在能够 利用各种不同的 Twitter API 查看用户的好友.追随者和时间线,以及其他内 容.但是,

Spark机器学习1·编程入门(scala/java/python)

Spark安装目录 /Users/erichan/Garden/spark-1.4.0-bin-hadoop2.6 基本测试 ./bin/run-example org.apache.spark.examples.SparkPi MASTER=local[20] ./bin/run-example org.apache.spark.examples.SparkPi scala import org.apache.spark.SparkContext import org.apache.spark

JVM 并发性: Java 和 Scala 并发性基础

Java 并发性支持 在 Java 平台诞生之初,并发性支持就是它的一个特性,线程和同步的实现为它提供了超越其他竞争语言的优势.Scala 基于 Java 并在 JVM 上运行,能够直接访问所有 Java 运行时(包括所有并发性支持).所以在分析 Scala 特性之前,我首先会快速回顾一下 Java 语言已经提供的功能. Java 线程基础 在 Java 编程过程中创建和使用线程非常容易.它们由 java.lang.Thread 类表示,线程要执行的代码为 java.lang.Runnable 

向Java开发者介绍Scala

Scala结合了面向对象编程与函数编程思想,使用一种能够完全兼容Java.可以运行在Java虚拟机上的.简洁的语法.对于函数编程风格的支持,尤其是对于Lambda表达式的支持,能够有助于减少必须要编写的逻辑无关固定代码,也许让它可以更简单的关注要面对的任务本身,而相对的Java中对Lamdba表达式的支持要到预定于2012年发布的JavaSE8才会实现.本文就是对于Scala介绍. 相关厂商内容 Flash Builder 4.5高级版试用版免费高速下载 QClub(北京站)--<云计算与虚拟化

Java 8 vs Scala — Part II Streams API

Stream 与 Collection 的比较 这是我按自己的意思给的一个十分简要的说明:collection 是一个有限的数据集,而 stream 是数据的一个序列,可以是有限的也可以是无限的.区别就这么简单. Streams API 是 Java 8 的一个新的 API,用于操作 collection 和 stream 数据.Collections API 会改变数据集的状态,而 Streams API 不会.例如,调用 Collections.sort(list) 会把传入的参数排好序,而