2019独角兽企业重金招聘Python工程师标准>>>

Scala学习手册--可伸缩的语言(随着使用者的需求而成长)

 第一章:基本概念

Scala=FP+OO、静态语言

兼容性、简短、高层级抽象、高级的静态类别、伸缩性

兼容:与Java兼容,可无缝实施互操作。Scala程序会被编译为JVM的字节码。性能通常一致。Scala可以调用Java方法,访问Java字段,继承自Java类和实现Java接口。实际上,几乎所有的Scala代码都极度依赖于Java库。

交互式操作的另一面是:Scala极度重用了Java类型,Int-->int,Float-->float,Boolean-->boolean。Scala的数组被映射到Java数组。Scala同样重用了许多标准Java库类型。

Scala不仅重用,而且增加了更多特性或改进,Scala字符串支持类似于toInt,toFloat的方法。

隐式转换:这通常在类型失配,或许选用不存在的方法时。在上面的例子里,当在字串中寻找toInt方

法时,Scala 编译器会发现String 类里没有这种方法,但它会发现一个把Java的String

转换为Scala 的RichString类的一个实例的隐式转换,里面定义了这么个方法。于是在

执行toIn t 操作之前,转换被隐式应用。

Scala 代码同样可以由Java代码调用。有时这种情况要更加微妙,因为Scala 是一种比Java

更丰富的语言,有些Scala 更先进的特性在它们能映射到Java 前需要先被编码一下。

简洁:分号可不写,且通常不写;类与构造函数的简写;类型推断

class MyClass(index:  Int , name:  String) //写得少就很少犯错误

高层级:业务逻辑的复杂带来了复杂的代码,过度复杂又带来了系统性能或导致崩溃。这种复杂无可避免,所以就需要由不受控转为受控。

Scala通过使用接口的抽象级别来帮助你管理复杂性。

函数式文本:

val  nameHasUpperCase = name.exists(_.isUpperCase) //判断String 包含一个大写字符

Scala是静态类型的:这就允许它提供泛型类、内部类、甚至多态方法(Polymorphic Method)。另外值得一提的是,Scala被特意设计成能够与Java和.NET互操作。

语法轻量级,原语富有表达力,这些可以从拆分器、组合器和执行器中体现

scala被广泛使用:渗透性、可伸缩性

var  capital = Map ("US"->"Washington", "France" -> "Paris")

capital += ("Japan" -> "Tokyo")

println(capital("France" ))

本例中的声明都是高层次的,也就是说,没有被外加的分号或者类型注释弄得乱糟糟的。实际上,这种感觉就好像那种现代的“脚本化”语言,比如,Perl ,Python或者Ruby。这些语言的一个普遍特征,与上例有关的,就是它们都在语法层面上支持“关联映射”。

方便性和灵活性

关联映射非常有用,因为它能让程序易读和清晰。

Scala更像一个杂货铺而不是大教堂,因为它被设计为让用它编程的人扩展和修改的。

新的类型

许多程序需要一个能够变得任意大都不会溢出或者由于数学操作而“绕回”

的整数类型。Scala在库类Scala.BigInt中定义了这样一个类型。这里有一个使用了那个

类型的方法定义,用以计算传入整数的阶乘值:

def  factorial(x:  BigInt):  BigInt =

if (x == 0) 1 else x * factorial(x - 1)

调用:factorial(30)

结果:265252859812191058636308480000000

BigInt 看上去就像一个内建的类型,因为你可以使用整数值和这种类型值的操作符如* 和- 。然而它只是凑巧定义在Scala标准库中的类。6如果这个类缺失了,可以直接由任意的Scala程序员写一个实现出来,举例来说,通过包装Java的类java.math.BigInteger(实际上,

Scala的BigInt 就是这么实现的)。

调用Java API实现:

import java.math.BigInteger

def  factorial(x:BigInteger):  BigInteger =

if (x == BigInteger.ZERO)

BigInteger.ONE

else

x.multiply(factorial(x.subtract(BigInteger.ONE)))

新的共享/并发程序

Java的线程模型是围绕着共享内存和锁建立的,尤其是当系统在大小和复杂度都得到提升的时候,这种模型常常是不可理喻的。

Java伴随着一个丰富的,基于线程的并发库。Scala 可以像其他JavaAPI 那样使用它编程。

然而,Scala 也提供了一个实质上实现了Erlang的行动类模型的附加库。

行动类是能够实现于线程之上的并发抽象。它们通过在彼此间发送消息实现通信。每个行

动类都能实现两个基本操作,消息的发送和接受。发送操作,用一个惊叹号表示,发送消

息给一个行动类。这里用一个命名为recipient 的行动类举例如下:

recipient ! msg

发送是异步的;就是说,发送的行动类可以在一瞬间完成,而不需要等待消息被接受和处

理。每一个行动类都有一个信箱:mailbox 把进入的消息排成队列。行动类通过receive

代码块处理信箱中受到的消息:

receive {

case Msg1 =>  ...  // handle Msg1

case Msg2 =>  ...  // handle Msg2

//  ...

}

接收代码块由许多case 语句组成,每一个都用一个消息模板查询信箱。信箱中第一个符

合任何case的消息被选中,并且执行相应的动作。如果信箱中不含有任何符合任何case的消息,行动类将休眠等待新进的消息。

这里举一个简单的Scala 行动类实现检查值(cheksum)计算器服务的例子:

actor {

var  sum = 0

loop {

receive {

case Data(bytes)    => sum += hash(bytes)

case GetSum(requester)  => requester ! sum

}

}

}

这个行动类首先定义了一个名为sum 的本地变量,并赋了初值为零。然后就用receive段

落重复等待在消息循环中。如果收到了Data 消息,就把发送的bytes取哈希值加到sum

变量中。如果收到了GetSum 消息,就用消息发送requester!sum 把当前sum 值发回给

requester。requester 字段嵌入在GetSum 消息里;它通常指出创建请求的行动类。

实际上,对于可伸展性这个话题来说这个例

子里面最重要的是,不论是actor还是loop 还是receive还是发送消息的符号“!”,这

些都不是Scala 内建的操作符。尽管actor,loop 和receive 看上去或者表现上都如此接

近于控制结构如while或者for 循环,实际上它们是定义在Scala 的行动类库里面的方法。

同样,尽管“!”看上去像是个内建的操作符,它也不过是定义在行动类库里面的方法。

所有这四个构件都是完全独立于Scala 语言的。

Scala 具有伸缩性

Scala 在把面向对象和函数式编程熔合成一套语言的设计方面比其他众所周知的语言都走

得更远。比方说,其他语言或许把对象和方法作为两个不同的概念,但在Scala 里,函数

值就是对象。函数类型是能够被子类继承的类。这看上去似乎不外乎学术上的美感,但它

从深层次上影响了可伸展性。实际上之前看到的行动类这个概念如果没有这种函数和对象

的联合将无法实现。

Scala函数式编程的主要思想:

第一理念:函数是第一类值,可以把函数当作参数传递给其他函数,当作结果从函数中返回或保存在变量里。你也可以在函数里定义其他函数,就好像在函数里定义整数一样。还可以定义匿名函数。

把函数作为第一类值为操作符上的抽象和创建新控制结构提供了便利的方法。这种函数的

泛化提供了很强的表现力,常能产生非常易读和清晰的程序。而且常在伸展性上扮演重要

的角色。例如,之前在行动类例子里演示的receive构造就是一个把函数当作参数调用的

方法。receive构造里面的代码是个未被执行的传入receive方法的函数。

相反,在多数传统语言中,函数不是值。确实有函数值的语言则又常常把它们贬为二类地

位。举例来说,C 和C++ 的函数指针就不能拥有与非函数指针在语言中同等的地位:函数

指针仅能指向全局函数,它们不允许你定义指向环境中什么值的第一类嵌套函数,也不能

定义匿名函数文本。

第二理念:程序的操作符应该把输入值映射到输出值而不是就地修改数据。

在Java和Scala 里,字串是一种数学意义上的字符序列。

使用表达式如s.replace(';', '.')在字串里替换字符会产生一个新的,不同于原字串s

的对象。用另一种表达方式来说就是在 Java里字串是不可变的(immutable)而在 Ruby

里是可变的。因此单看字串来说,Java是函数式语言,而 Ruby 不是。不可变数据结构是

函数式语言的一块基石。Scala 库在Java API 之上定义了更多的不可变数据类型。例如,

Scala 有不可变的列表,元组,映射表和集。

第三理念:方法不应有任何副作用:side effect。它们唯一的与所在环境交流的方式应该是获得参数和返回结果。

举例来说,Java 的String 类的replace 方法符合这个描述。它带一个字串和两个字符并产生一个所有一个字符都被另一个替代掉的新字串。调用replace不会有其他的结果。类似于 replace这样的方法被称为指称透明:referentially transparent ,就是说方法调用对任何给定的输入可以用它的结果替代而不会影响程序的语义。

函数式语言鼓励不可变数据结构和指称透明的方法。有些函数式语言甚至需要它们。Scala给你选择。如果你需要,你也可以写成命令:imperative 形式,用可变数据和有副作用的方法调用编程。但是Scala 通常可以在你需要的时候轻松避免它们,因为有好的函数式编程方式做替代。

第二章、语法学习

1.变量:声明变量可以使用val和var,val类似于java里的final变量,一旦初始化就不可变;var如同java里的非final变量,可以在其生命周期内多次赋值。

类型推导:type inference,理解你省略的类型的能力。

函数及返回值缩写规则:

1:可以不写返回值,由编译器自动推导

2:如果函数方法体可以用一个句子组成,可以省略{}

如:scala> def max2(x:  Int , y: Int ) = if  (x > y) x else y

3:函数不带参数也没有返回值,比如:

scala> def greet() = println( "Hello, world!")

greet: ()Unit

greet表示函数名,()表示参数特点--不带参数,Unit是greet的结果类型(在Java里被认为是返回值),Unit表示函数没有返回有用户的值(实际上scala里的Unit会被编译器映射为Java里的void)。

循环:

while循环

var  i = 0

while (i < args.length) {

println(args(i))

i += 1  //scala只支持i+=1或者i=i+1,不支持i++/++i自增操作

}

var r=0; var i=1; while(i<100){r+=i*i;i+=2};

foreach和for枚举

转载于:https://my.oschina.net/hanzhankang/blog/200063

Scala学习--《Scala编程》相关推荐

  1. scala学习-scala读取Hbase表中数据并且做join连接查询

    1.业务需求:sparkSQL on hbase ,sparkSQL直接读取Hbase中的两个表,进行连接查询. 2.图示 绿色的线 上图中绿色的线是做过测试的,直接在hive中建表,然后load数据 ...

  2. scala学习-scala通过mkString方法把一个集合转化为一个字符串

    Problem 如果你想要把集合元素转化为字符串,可能还会添加分隔符,前缀,后缀. Solution 使用mkString方法来打印一个集合内容,下面给一个简单的例子: scala> val a ...

  3. scala学习-scala中的元组Tuple概念

    1.Tuple的英文意思是元组的意思 2.场景:当在一个方法中, 你需要返回几个对象,这几个对象的类型一致,你可以返回一个数组:如果几个对象的类型不同呢,当然你可以返回一个Object[]数组,可是这 ...

  4. scala学习-scala中的特殊符号使用

    1.=> 使用 目前知道的基本和匿名函数定义和函数类型声明有关,以及在case语句中的使用 1. 匿名函数定义, 左边是参数 右边是函数实现体 (x: Int)=>{} 2.函数类型的声明 ...

  5. scala学习-scala中:: , +:, :+, :::, +++的区别

    4种操作符的区别和联系 :: 该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表.用法为 x::list,其中x为加入到头部的元素,无论x是列表与否,它都只将成为新生成列表的第一个元素 ...

  6. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习:1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法:class User {private v ...

  7. 机器学习(三)--- scala学习笔记

    Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...

  8. Spark之scala学习(基础篇)待更新

    文章目录 引言 大数据介绍 大数据与云计算区别 大数据和人工智能的区别 大数据和传统的分析(excel)的区别 scala的特性 面向对象特性 函数式编程 函数式编程的特点: 函数式编程的优势 静态类 ...

  9. Scala学习笔记04:内建控制结构

    Scala学习笔记04:内建控制结构 scala提供的控制结构并不算多,因为在函数式编程中,可以自己开发出各种功能的控制结构,所以scala提供的原生控制结构仅仅够用为止. 1.if - 判断 if是 ...

最新文章

  1. 设计模式-创建型模式-建造者模式
  2. java错误:The superclass javax.servlet.http.HttpServlet was not found on the Java Bu
  3. python 乒乓球_python游戏练手--乒乓球
  4. Vue指令之v-on
  5. MIME类型“ image / jpg”是否与“ image / jpeg”相同?
  6. 联想m7400更换墨粉盒怎么清零_联想M7400、7600打印机换粉盒或加碳粉后,仍提示缺粉?联想7400、7600硒鼓加粉清零图解...
  7. 七雄Q传封包辅助技术探讨回忆贴
  8. Trusted Computing and DRM
  9. SWUSTOJ #617 班级课程成绩计算
  10. python用函数计算个人所得税_用if函数计算个人所得税
  11. 哈佛大学最受欢迎的幸福课——幸福的方法
  12. 读刘未鹏师兄的大学时光有感
  13. delmia机器人建模与装配
  14. 百度站长平台主动推送Python源码
  15. STM32多时段闹钟(10个闹钟),网络自动校时
  16. 楼上漏水,楼下被淹,如何维权
  17. 微信小程序分享到朋友圈
  18. 仓库软件管理系统设计思路(神龟管理1.0版)
  19. 【设计模式】策略模式VS状态模式
  20. Python_week04

热门文章

  1. 欧莱雅收购AI公司ModiFace,想让自拍照“一键上妆”
  2. RxJava2:Observable和Observer如何传递
  3. 我们应该如何(以及为什么)要将Typescript与Express、nodejs一起使用(译文)
  4. 【scrapy windows环境下安装遇到的问题】
  5. 外链应该这样发,网站排名速度提升十陪
  6. NFS==network file system
  7. Centos源码安装Python3
  8. ECMAScript 6新特性介绍
  9. 随机生成A~Z的字母CharDemo
  10. windows系统上安装与使用Android NDK r8d(二)