Scala极速入门
摘要 当面向对象遇到函数式编程,这就是Scala。简练的语言描述与简单的例子相辅相成,希望能够对大家学习Scala有所帮助。
scala 入门 定义 Scala语言是一种面向对象语言,同时又结合了命令式(imperative)和函数式(functional)编程风格。官网描述:Object-Oriented Meets Functional(面向对象遇到函数式编程)。 安装 下载地址http://www.scala-lang.org/download/ 当前版本2.11.4 设置环境变量 export SCALA_HOME=/home/mupeng/Hadoop/scala-2.11.
export PATH=$SCALA_HOME/bin:$PATH 如果是修改的profile,执行source /etc/profile,使环境变量立即生效。 检测安装是否成功命令 scala -version,如果出现以下内容,证明安装成功。 scala -version
Scala code runner version 2.11. -- Copyright -, LAMP/EPFL Scala解释器 直接输入scala,就进入scala解释器 scala
Welcome to Scala version 2.11. (Java HotSpot(TM) -Bit Server VM, Java 1.6.0_35).
Type in expressions to have them evaluated.
Type :help for more information. 先来两个例子,熟悉以下scala解释器 scala> +
res0: Int = 结果被命名为res0,Int指结果类型,3指计算结果 scala> println("hello scala")
hello scala 输出hello scala 变量 Scala中的变量有两种var和val(val类似于Java中final,值不可改变) scala> var hello = "hello world" hello: String = hello world scala可以根据赋值内容推算出变量类型。Scala中的数据类型都是对象。 函数 Scala是面向对象语言同时也是函数式编程语言,因此函数在Scala语言中的地位同对象、变量一样。使用scala函数注意一下几点: ) 函数参数写在类型之前,中间用逗号隔开; def helloScala = {
println("Hello Scala!")
} ) 函数都有返回结果,无需使用return,函数内最后一个表达式作为返回结果返回。helloScala函数的返回类型为Unit,表示该函数不返回任何有意义的值(相当于Java中的void)。 ) 函数参数可以给定默认值。 def hello(name : String = "Scala") : String = {
return "Hello : " + name
} ) 函数的参数都是val类型,执行过程中不能被改变。(函数式编程的特点,只计算结果,不改变参数) ) 定义方法还有如下方式 def add = (x : Int, y : Int) => x + y 打印结果print(add(, )); def add2(x : Int)(y : Int) = x + y 打印结果print(add2()()) 循环 在了解循环之前,我们先要知道Scala不支持i++和++i,需要使用i+=1来实现加一。 while循环 var i=
while (i < args.length) {
println (args(i))
i+=
} for循环 for (arg <-args)
println(arg) for参数里面同样支持if判断,比如输出1——10中的偶数 for (i <- to if i % == )
println(i) foreach args.foreach(arg => println(arg)) 因为参数只有一个,表达式也只有一个,可以简写为 args.foreach(println) Array与List 创建数组有两种方式 val greetStrings = new Array[String]()
greetStrings() = "Hello"
greetStrings() = ", "
greetStrings() = "world!\n" 或者 ?
val numNames = Array("zero", "one", "two") 注意与Java不同的是:数组的第零个元素是greetStrings(),不是greetStrings[]。 Array长度不可变,但是它的值可变。 List长度与值都不可变。 val list1 = List(, )
val list2 = List(, )
val list3 = list1 ::: list2 //list3结果为(1,2,3,4)
val list4 = :: list3 //list4结果为(0,1,2,3,4) 这里有两个操作 ::: 连接两个List :: 右操作符,将一个新元素放到List的最前端。 类与对象 . 定义类 class Person {
var email = "abc123@126.com" // 变量,var声明会生成getter和setter方法
var name : String = _ // 变量, _起到占位符的作用
val age = ; // 常变量,val声明只会生成getter
private val gender = "male" //只能在类内部使用
} 缺省访问级别是public,一个源文件中可以有多个class,都是public的。 . 主构造器 class Student(var name : String, val number : String) {
println("主构造器!")
} )主构造器直接跟在类名后面,主构造器的参数最后会被编译成字段。 )主构造器执行的时候,会执行类中所有的语句。 )如果主构造器参数声明时候不加val或者var,就相当于private . 从构造器 class Student(var name : String, val number : String) {
println("主构造器!")
var gender : String = _
def this(name : String, number : String, gender : String) {
this(name, number)
this.gender = gender
}
} )从构造器定义在类内部,方法名为this )从构造器必须先调用已经存在的构造器 . 继承:继承而来的字段不需要加var或者val class UniversityStudent(name : String, number : String, val major : String) extends Student(name, number) {
......
} 注意:重写父类的字段或方法要在前面加上override关键字 . 抽象类(abstract class)与特质(trait) )抽象方法不需要加关键字,只有声明,没有具体实现。 )可以声明抽象字段,也就是没有初始值。 )子类重写父类的抽象方法或者抽象字段,不需要加override trait特质可以理解为可以有具体实现方法的接口,类可以通过with关键字混入(mix-in)特质,同时它的对象也可以混入特质。 Scala程序的执行入口是提供main方法的独立单例对象。同样也可以给一个单例对象混入App特质,去继承App特质中的main方法. . apply方法 )对象的apply方法 class ApplyTest {
println("Test")
} object ApplyTest {
def apply() = new ApplyTest
} // 调用方法
val a = ApplyTest() // 类名+括号,调用对象的apply方法 上面例子中一个调用apply方法,生成一个新的对象。(绝大多数apply方法都是这样去用) apply方法就是Scala提供的一个语法糖,对象的apply方法在scala里面非常常用 例如: val arr = Array(, , ) 实际调用的是 val arr = Array.apply(, , ) 以下是Array对象的apply方法源码 object Array extends FallbackArrayBuilding { ... /** Creates an array of `Int` objects */
// Subject to a compiler optimization in Cleanup, see above.
def apply(x: Int, xs: Int*): Array[Int] = {
val array = new Array[Int](xs.length + )
array() = x
var i =
for (x <- xs.iterator) { array(i) = x; i += }
array
} ... } )类的apply方法 class ApplyTest {
def apply() {
println("APPLY Method")
}
println("Test")
} val a = new ApplyTest
a() // 对象名+括号,调用类的apply方法 .单例 用object替换class,其它的跟定义类类似。 当单例对象与类共享同一个名字时,该对象称作类的伴生对象。 与Java对比 如果用作服务器端开发,Scala的简洁、灵活性是Java无法比拟的;如果是企业级应用开发、Web开发,Java的强大是Scala无法匹敌的。我们不用一种语言的优势去抨击另一种语言的短板,所以不要说Java与Scala孰优孰劣,更不要说谁将要取代谁,二者本来就是互补关系。 总结 scala语言的知识点有太多太多,在一篇博客中不可能做到一一列举。本文只是列举了常用的的几点,希望对正在学习scala的人有所帮助。 相关博文:Scala快速排序的实现分分钟掌握快速排序 Spark入门博文 Spark初探 出处http://my.oschina.net/mup/blog/363436?from=20150111
Scala极速入门的更多相关文章
- [转]Nginx基本功能极速入门
原文链接:Nginx基本功能极速入门 | 叉叉哥的BLOG 本文主要介绍一些Nginx的最基本功能以及简单配置,但不包括Nginx的安装部署以及实现原理.废话不多,直接开始. 1.静态HTTP服务器 ...
- 《Python黑客编程之极速入门》正式开课
玄魂 玄魂工作室 今天 之前开启了一个<Python黑客编程>的系列,后来中断了,内容当时设置的比较宽,不太适合入门.现在将其拆分成两个系列<Python黑客编程之极速入门>和 ...
- 1 小时 SQL 极速入门(三)——分析函数
1 小时 SQL 极速入门 前面两篇我们从 SQL 的最基础语法讲起,到表联结多表查询. 大家可以点击链接查看 1 小时 SQL 极速入门(一) 1 小时 SQL 极速入门(二) 今天我们讲一些在做报 ...
- Go 语言极速入门
本系列文章主要是记录<Go 语言实战>和<Google 资深工程师深度讲解 Go 语言>的学习笔记. Go 语言极速入门1 - 环境搭建与最简姿势Go 语言极速入门2 - 基础 ...
- Scala快速入门到精通 视频教程 百度云网盘下载地址
Scala快速入门到精通 视频教程 百度云网盘下载地址 Scala快速入门到精通 下载地址链接:https://pan.baidu.com/s/1bqGIKyF 密码:ojwd
- 多本Python极速入门最佳书籍,不可错过的Python学习资料!
Python作为现在很热门的一门编程语言,介于Python的友好,许多的初学者都将其作为首选,为了帮助大家更好的学习Python,我筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. ...
- Knative 初体验:CICD 极速入门
Knative 社区很早就在讨论用 Tekton 替换 Build 模块的相关事宜.Knative Build 官方已经正式说明不再建议使用 Knative Build 了. 如果你知道 Knativ ...
- scala快速入门之文档注释
scala快速入门之文档注释 1.在项目栏的目录树中找到该源码,右击点击Show in Explorer, 即可找到该源码的本地路径,在路径中输入cmd 2.执行scaladoc -d 生成文档注释 ...
- Scala快速入门 - 基础语法篇
本篇文章首发于头条号Scala快速入门 - 基础语法篇,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干货,也欢迎关注我的 ...
随机推荐
- 运行jupyter notebook 出错 Error executing Jupyter command 'notebook'
实际上是安装jupyter时候有错误, 仔细看日志发现需要缺少 Microsoft Visual C++ Compiler for Python 2.7 下载安装后,重新安装jupyter即可 htt ...
- LVS Nginx Haproxy对比
一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术. 具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了: 如果机器不少,可以 ...
- python数据之间的转换和关系
首先数据类型在我看来分为两类: 容器类:能存储数据,例如:元祖.列表.集合.字符串. 原子类:单纯保存数值,例如:整数.浮点数.复数. 容器类与容器类之间,一般都可以进行两两之间的转化. 原子类与原子 ...
- 无法处理文件 MainForm.resx,因为它位于 Internet 或受限区域中,或者文件上具有 Web 标记。要想处理这些文件,请删除 Web 标记
无法处理文件 MainForm.resx,因为它位于 Internet 或受限区域中,或者文件上具有 Web 标记.要想处理这些文件,请删除 Web 标记 问题: 由于文件锁定,VS不能正常读取. 解 ...
- Linux Shell基础 Bash常见命令 history、alias命令以及常用快捷键
概述 shell中常见命令history 历史纪录命令:history 命令格式如下: [root@localhost ~]# history [选项] [历史命令保存文件] -c:清空历史命令: ...
- Windos Server 2008 Backup 安装使用
系统环境:Windos 2008 R2 x64 实施方案:备份系统 完全备份,每周备份一次,备份文件映射到文件服务器. 安装备份工具 使用Windos Sserver Backup 做备份 设置每周备 ...
- POI 百万数据导出
poi 导出主类 package test; import java.io.File; import java.io.FileOutputStream; import java.lang.reflec ...
- 读完这篇文章,就基本搞定了Redis数据库
简单来说Redis就是一个数据库,不过与传统的数据库不同的是Redis的数据是存在内存中的,所以存写速度非常快,因此Redis被广泛应用于缓存方向. 另外,Redis也经常用来做分布式锁.Redis提 ...
- iOS应用适配IPV6
网络收集,连接如下: 针对苹果iOS最新审核要求为应用兼容IPv6 iOS应用支持IPV6,就那点事儿 iOS 适配iPV6的修改(AF及其他第三方库)
- INSPIRED启示录 读书笔记 - 第9章 产品副经理
发现帮手 从本质上讲,产品就是创意,产品经理的职责是想出好点并加以实现.我们需要好点子,有些想法是我们自己的创意,但如果仅依靠自己,就会严重限制创意的发挥 做产品要找公司最聪明的人合作,发现公司里潜在 ...