Scala: 从一种复杂度到另一种复杂度?

关注编程语言发展情况,尤其是关注Java相关语言的朋友们,今年一定已经知道了Scala。

Scala语言从2001年就开始设计,2003年发布第一个版本,但直到今年,在国内才有点“热”起来的迹象。把Scala推到风口浪尖的事件有两个:一个是09年初,Twitter宣布后台有部分迁移到Scala上以提高性能和可靠性;其次是09年夏天,Groovy创始人声称Scala将取代Java成为JVM上的首选语言

Scala之所以引起如此关注,以上事件其实只是导火索,其后揭示的,是Java自身发展缓慢、社区对Java的不满日益堆积等诸多问题,也显示了 java 社区对新的语言特性以及新语言的强烈渴望。

当然,Scala是不是能够取代Java而成为JVM上的王者,那不是一个人说了算,也不是短时间内能够见分晓的(个人觉得至少两年之内不会),这将是一场旷日持久的演进和争夺。Scala作为一个新兴语言,虽然语言特性有许多可圈可点之处,但毕竟实际的应用场景极度缺乏,有很多问题都还没有暴露。等到它真的成熟到被开发人员普遍接纳的时候,也许JVM上已经实现了“众生平等”的多语言无缝集成的境界,所以也就无所谓谁是王者了。

我用Java有八九年了,对于Java的问题,多少也有感受,当听说一个语言号称能够解决Java的问题,比Java更强大时,自然要去关注。于是,我从10月初开始看尝试学习Scala,主要是看官方的文档,到现在为止,只能算初窥门径。看的过程中,有些想法,跟大家分享、讨论。

在真正开始学习之前,通过零星接触的材料,Scala给我留下的印象归纳为两个词:简单、先进。目前初窥门径后,Scala给我的印象是:的确先进(相对于Java),而且非常灵活,但简单不等于容易

所谓的“简单”,其实用“简洁”更合适。目前Java有些语法比较臃肿,为人所诟病,比如最典型的就是泛型语法,因为Java中缺乏类型推导机制,所以用到泛型,我们必须写出如下的代码:
List strList=new ArrayList();
而在Scala中,只需要:
def strList = new ArrayList[String]

当然,Scala对语法的简化可不止限于泛型,还有省略行尾的分号,某些情况下无需显式的set, get方法定义,更加灵活的函数调用语法(省去点号、省去无参函数后的括号等等),大量符号的灵活运用(得益于函数式编程能力)以及语言内置的syntax sugar等等,不一而足。

不过,我一直很怀疑这种致力于“降低程序员敲键次数”的语法化简是不是真的非常必要,尤其在IDE越来越强大的情况下。至少对于我这个新手来说,有些程序因为语法过于简洁,所以必须花点心思去理解,程序的逻辑分析起来,不像对应的Java代码那么直观。这就意味着,要想更好的驾驭Scala,需要更多的时间。对程序员的要求也更高;这还意味着,做同一件事情,可能的方式会更多,程序员的编程风格差异会加大,是否会带来沟通和理解的问题,也需要时间的验证。

但是,不可否认,相比Java,Scala的确更强大、更先进、更灵活。Scala的强大,并不是它创造了多少新东西,而是它借鉴了大量语言中的优秀特性,尤其是函数式编程语言的特性,并且把这些特性跟面向对象的思想相结合,融入到一个语言当中。

可是,如果初学者是只有Java的编程背景,那么学习Scala还是有不小的门槛(个人感觉),如果有函数式编程的背景,则相对要容易一些。举个简单的例子,如果您只写过Java代码,您可以猜出来下面这行代码的功能吗:
List(1, 2, 3, 4, 5) reduceLeft { _ * _ }
其实,代码中的“_ * _”是一个极度简化的函数定义:
def multiply(x:int, y:int): int{
    return x * y ;
}
而整个代码的作用则是求List中所有元素的连积,也就是1*2*3*4*5=120。在Java中,我们通常要写一个循环来实现相同的功能。

Scala的函数式编程特性,使得函数可以当作参数传递,函数可以作为值返回,的确是大大增强了语言的表达能力,特别适用于解决特定的问题,例如涉及到循环、迭代、数学算法等等。

我觉得从Java到Scala,虽然语法简洁了,代码简化了,但学习的复杂度增加了,所以我将其称为“从一种复杂度,到另一种复杂度”,是从代码的复杂度,转换成了思维的复杂度,或者说,我们至少需要去转变思维去适应另外一种思想,才能体会到Scala语言简洁性所带来的价值。

总之,Scala是一个优秀的语言,值得Java程序员去学习、去关注。

一家之言,还在学习中,仅供一起在路上的朋友们参考。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值