《Scala程序设计》暨Scala简介
JVM语言
JVM上的语言越来越多了,从前几年的groovy、Scala和Clojure,现在又听说一门Kotlin。对于前三种语言,groovy算是JVM平台上的动态脚本语言,可以类比Python;Scala以其直逼C++的语言复杂度而出名,但是该语言的流行是因为高并发(akka)和大数据处理(Spark);Clojure是JVM上的Lisp重现,是纯粹的函数式编程语言,它在实时计算(Strom)中承担了一部分责任。
选择Scala
我决定了解Scala的原因是高并发,以及它与Java具备良好的互操作性,因此我试图在将来的项目中引入Scala,让其负责项目的并发处理模块。
Scala令我刮目相看的地方还有,很多语言特性的设计就会让你不自觉使用一些设计模式,或者说根本不需要设计模式。例如:利用Trait可以轻易实现装饰器模式、利用函数值可以轻易实现策略模式等。
在《Scala程序设计》这本书中,作者给出了Scala的几个重要特性:
- 拥有基于事件的并发模型(从2.10+版本中开始转向akka)
- 既支持命令式风格,又支持函数式风格
- 是纯面向对象的
- 可以很好得与Java混合
- 它强制使用自适应静态类型
- 它简洁而有表现力
- 它构建于一个微内核之上
但是 Scala为什么在国内不太火呢?据说是复杂度太高,黑魔法太多,导致学习曲线过于陡峭,对此我的看法是:Scala是一门密度很高的语言,它的作者好像很懒,还是烦透了Java那过于冗余的代码风格,Scala完全是为了少写代码而设计。我们在使用Scala的一些语法糖的时候,应该兼顾可读性,在不影响可读性的情况下使用Scala的黑魔法。
团队在推广使用Scala之前,要首先学习它的语言规范(官方的没有?那就制定团队自己的),这时可以参考Effective Scala
本书主要内容
通过前面的论述,相比你也明白自己是否会选择Scala了,跟随下面的列表,可以大概了解下Scala的具体内容了。
类型推导:Scala不同于其他静态类型语言,它不要求开发者提供冗余的类型信息,定义变量的时候使用var和val,但是scalac会进行类型推导,检查类型引用是否得当。这点使得Scala既有动态语言的自由,又能在编译时发现不少类型错误。
函数值和闭包:函数可以当作参数传递给函数,可以从函数中返回,甚至可以在函数中嵌套,这些高阶函数称之为函数值。闭包是一种特殊的函数值,闭包中封闭或绑定了在另一个作用域获上下文中定义的变量。
Trait和类型转换:Trait就像一个拥有部分实现的接口,它提供了一个介于单一继承和多重继承的中间地带,我们可以在某个对象实例中混入某些Trait,也可以在某个类的所有实例中混入。通过Trait可以轻易实现设计模式中的装饰器模式。
Scala的容器:Scala提供了常用的容器——List、Map和Set,其中List和Map都有可变(mutable)和不可变(immutable)两种,但是Scala倾向于使用不可变对象。按照函数式编程思想,所有的变量都应该是不可变的,这样可以消除共享变量,乃至消除竞态条件。
模式匹配和正则表达式:在Scala里,模式匹配仅次于函数值和闭包,是使用第二广泛的特性。
并发编程:Java不适合并发编程的明证是,仅仅为了这个话题就足够出一本书了——《Java并发编程实战》,在Scala里,最开始是基于事件的模型进行进程间通信,本书介绍了Scala actor模型的概念。现在再学习Scala的并发编程,建议直接学习akka。可以参考:一个超简单的akka actor例子
与Java互操作:将Scala代码与Java或JVM上其他语言的代码混合使用很容易,Scala和Java一样,都是编译成字节码。通过这一部分的学习,我们可以明白在Java应用中的哪一部分可以使用Scala来提高开发效率,优化软件产品。
异常处理:Java中的checked Exception强制我们捕获并不关心的异常,所以,一些程序员只放一个空的catch块在那里压制异常,而不是让它们自然传递到正确的地方被处理。即使是没有压制异常,也破坏了Java应用的封装性。在Scala中,我们可以处理关心的异常,忽略其他的异常。
欢迎大家扫码关注微信公众号:我是攻城师,我们一起学习,进步和交流!(duqi_Voice)本公众号的内容是IT技术(Java、虚拟化、大数据等),健身心得和生活感悟,也是一个温馨的技术互动交流的小家园,有什么问题随时都可以留言,欢迎大家来访! :
《Scala程序设计》暨Scala简介的更多相关文章
- Scala学习(一)--Scala基础学习
Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...
- java.lang.String cannot be cast to scala.runtime.Nothing Scala中的Nothing类型
经常在写Rdd的时候, 如: val OWNER_ID=row.getAs("OWNER_ID") 等, 运行是可能会报异常 : java.lang.String cannot ...
- 三、使用maven创建scala工程(scala和java混一起)
本文先叙述如何配置eclipse中maven+scala的开发环境,之后,叙述如何实现spark的本地运行.最后,成功运行scala编写的spark程序. 刚开始我的eclipse+maven环境是配 ...
- Scala具体解释---------Scala是什么?可伸展的语言!
Scala是什么 Scala语言的名称来自于"可伸展的语言". 之所以这样命名,是由于他被设计成随着使用者的需求而成长.你能够把Scala应用在非常大范围的编程任务上.从写个小脚本 ...
- [Scala] java使用scala的jar包问题:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
场景 刚写的scala处理bmp文件的实验, 打了jar包让java调用一下, 结果发生这个错误. package org.tanglizi.bmp.demo; import org.tanglizi ...
- Intellij IDEA 安装Scala插件 + 创建Scala项目
一.IDEA 2018 Ultimate edition (旗舰破解版下载地址) 百度网盘地址:https://pan.baidu.com/s/1d9ArRH6adhDUGiJvRqnZMw 二.I ...
- Scala教程之:Scala基础
文章目录 常量 变量 代码块 函数 方法 类 case类 对象 trait main方法 这篇文章我们大概过一下Scala的基础概念,后面的文章我们会有更详细的讲解Scala的具体内容. 常量 在Sc ...
- Scala学习随笔——Scala起步
实验楼学习Scala语言的笔记,课程网址为https://www.shiyanlou.com/courses/490 一.Scala简介 Scala 是一门多范式的编程语言,类似于 Java .设计初 ...
- scala调用系统-scala.sys.process使用
简介 scala.sys.process提供了shell的和系统交互的DSL,包括执行命令, 逻辑操作, 重定向, 管道等操作. 启动流程要执行与ProcessBuilder关联的所有外部命令,sca ...
随机推荐
- 异常DBG_PRINTEXCEPTION_C(0x40010006)和DBG_PRINTEXCEPTION_WIDE_C(0x4001000A)
简介 DBG_PRINTEXCEPTION_C,代码0x40010006:DBG_PRINTEXCEPTION_WIDE_C,代码0x4001000A:在调试器的控制台窗口打印异常信息/调试信息.它定 ...
- python yield实现协程(生产者-消费者)
def customer(): r="" while True: n=yield r#,接收生产者的消息,并向消费者发送r print("customer receive ...
- [RN] React Native 使用 图片预览和放大 插件 react-native-image-zoom-viewer 过程中,放大报错问题
React Native 使用 图片预览和放大 插件 react-native-image-zoom-viewer 过程中,放大报错问题 报错如下: Cannot record touch end w ...
- [FJOI2018]所罗门的宝藏
大概是最后一篇题解,其实只是想颓废一下打个故事 据古代传说记载,所罗门王即是智慧的代表,又是财富的象征.他建立了强大而富有的国家,聚集了大批的黄金象牙和钻石,并把这些价值连城的珍宝藏在一个神秘的地方, ...
- 安装-supervisor
centos 7.xx 1.#yum install python-setuptools 2.#easy_install supervisor 3.# vim /etc/supervisord.con ...
- Python(三)对装饰器的理解
装饰器是 Python 的一个重要部分,也是比较难理解和使用好的部分.下面对装饰器做一下简单整理 1. 前言 装饰器实际上是应用了设计模式里,装饰器模式的思想: 在不概念原有结构的情况下,添加新的功能 ...
- 【Maven插件】exec-maven-plugin
<plugin> <artifactId>exec-maven-plugin</artifactId> <groupId>org.codehaus.mo ...
- 【视频开发】IR-CUT作用
自然界存在着各种波长的光线,通过折射人眼能看到不同颜色的光线,这就是光线的波长不同所导致的.其实还有许多光线是人眼看不到的,人眼识别光线的波长范围在320nm-760nm之间,超过760nm的光线人眼 ...
- AQS4源码
@SuppressWarnings("restriction") public abstract class AbstractQueuedSynchronizer1 extends ...
- [转帖]pidstat 命令详解
pidstat 命令详解 https://www.jianshu.com/p/3991c0dba094 pidstat -r -u -d -p 各种参数非常好用. pidstat 概述 pidstat ...