R语言码农的Scala学习心得
为了MLib,最近是铁了心要学好Spark。关注本博客的朋友应该知道我的主力语言是R,无论是训练模型还是做Elasticsearch,都是通过R脚本来操作的。之前的《通过 Spark R 操作 Hive》这篇博文中我对通过R来操作Spark还存在幻想,实际使用之后基本放弃了这种想法,因为目前的Spark R可用功能十分有限,并且运行效率也不理想,干脆就决定好好学一下原生的Scala!本文将类比R与Scala,从R语言码农的角度介绍一下Scala的学习心得: 注:本文不求全,只求实用,想学习详细语法推荐阅读《快学Scala》
1.变量
R:直接给变量赋值
test = 1
Scala:val代表不可变,var代表可变,可以不写变量类型,scala会根据所赋的值进行推断
val test:Int = 1
val test1 = 1
var test2 = 1
2.判断与循环
R:
if (test > 0) {
print(test)
}
for (i in 1:10) {
print(i)
}
Scala:判断语句一样,循环语句也非常类似,像R一样,Scala可以通过to或者until函数非常方便地生成连续整数用于循环
if (test > 0) {
print(test)
}
for (i <- 1 to 10) {
print(i)
}
3.函数
R:
doubleX = function(x) { x * 2 }
Scala:R与Scala都会将函数体中最后一个值作为返回值因此不需要写return;Scala中参数的类型是必须定义的而返回值的类型则不一定需要写(例外是递归函数,无法推断出返回值的类型);与其它主流语言不同的是两者在函数定义中都有“=”,Scala的函数如果没有返回值(返回Unit)则可以省去“=”
def doubleX(x:Double):Double = { x * 2 }
4.集合
R:R语言里常用的集合就四种:vector, matrix, dataframe, list,写起来基本以开发效率优先,很少考虑数据结构与运行效率;从一个集合变换为另一个集合是常用操作,一般很少使用循环语句,取而代之的是sapply或者lapply
# vector
c(1, 2, 3) # matrix
matrix(1:10, nrow=2) # dataframe
data.frame(x=1:3, y=4:6) # list
list(1:4, c('a', 'b', 'c')) # sapply
sapply(1:5, function(i) i*2)
Scala:运行在jvm里的Scala与Java语言兼容性非常好,拥有丰富的集合以及较为全面的数据结构,同时又不需要像Java那样写冗长的代码,可以说在开发效率与执行效率之间找到了一个不错的平衡点

上示的是所有不可变的集合(immutable collection),主要分为三类:Seq,Set,Map,以下分别介绍:
4.1 Seq
IndexSeq与LinearSeq:IndexSeq类似于Java的ArrayList,LinearSeq类似于Java的LinkedList。 Vector:以树形结构实现,支持快速的随机访问。 Range:前边提到的1 to 10生成的就是Range,并不存储所有值而只是起始值、结束值和增值。 List:根据When should I choose Vector in Scala?所说,List的优势在于head与tail方法,快速获取首个元素与其余子list,因此大多数情况下会选用Vector。
# 创建对象
val test = Vector(1, 2, 3) # 按下标选取值,从0开始
test(0) # 集合变换
test.map(x => x * 2) # 如果map中匿名函数的参数在=>右侧只出现一次可以用_替换
test.map(_ * 2)
4.2 Set
HashSet:Set是不重复元素的集合,默认的Set是HashSet不保留插入的顺序,它的优势是查找元素的速度比Array和List快得多。 ListSet:维护一个链表使得元素插入的顺序可以被记住。 SortedSet:得到已排序的Set。
4.3 Map
Map是对偶(求英文名)或者键值对的集合,对偶是最简单的元组(tuple),元组是可以包含不同类型对象的集合。
# 创建Map
val mapTest = Map('a'->1, 'b'->2, 'c'->3) # 元组按下标选取值,从1开始
val test = 'a'->1
test._1 # 选出值<3的Map子集
mapTest.filter(_._2 < 3)
5.面向对象
R:R常被用来写脚本,较少用于庞大的项目,因此面相对象的用法较少,在工作中应用过S4的方法,但说实在的语法真的挺奇怪的,用起来不舒服。 Scala:作为Java的兄弟,Scala的面向对象编程可谓非常完整,这里记录一些Scala区别于Java的地方
5.1 class
class Person(var age: Int) { }
var person = new Person(10)
person.age = 20
println(person.age)
- 与Java不同,Scala可以像给函数定义参数一样给类定义字段,这被称为主构造器
- Scala会自动为类生成setter和getter,上面例子中对age的取值与赋值其实是通过setter与getter方法实现的
5.2 object
- Scala不能在类中定义静态方法与静态字段,不过可以通过object来近似实现
- object不能提供构造器
- 与class同名且在同一个源文件中的object,可以与类互相访问私有特性,被称作伴生对象
- 初始化集合对象时,如:Vector(1,2,3),其实是调用了Vector object的apply方法
- 每个Scala程序都必须从一个object的main方法开始,这个object就是应用程序对象
- 用obect可以实现枚举
- unapply是一个接收对象,返回构造参数的方法,定义了这个方法的object被称作提取器
5.3 trait
- 可以把它当成能够有方法实现的接口
6.模式匹配
能够各种姿势地模式匹配绝对是Scala的一个巨大优点,这一节只有Scala部分,以下通过举例来展现:
6.1 switch中的模式
# if守卫
ch match {
case '+' => sigh = 1
case '-' => sigh = -1
case _ if Character.isDigit(ch) => digit = Character.digit(ch, 10)
case _ => sigh = 0
} # 类型匹配(不需要用asInstanceOf)
obj match {
case x:Int => x
case s:String => Interger.parseInt(s)
case _:BigInt => Int.MaxValue
case _ => 0
} # 匹配数组、列表和元组
arr match {
case Array(0) => "0"
case Array(x, y) => x + " " + y
case Array(0, _*) => "0 ..."
case _ => "something else"
}
6.2 变量声明中的模式
scala> val (x, y) = (1, 2)
x: Int = 1
y: Int = 2 scala> val (q, r) = BigInt(10) /% 3
q: scala.math.BigInt = 3
r: scala.math.BigInt = 1 scala> var Array(first, seccond, _*) = Array(1,2,3)
first: Int = 1
seccond: Int = 2 # 正则表达式
scala> val numitemPattern = "(\\d+) (\\w+)".r
numitemPattern: scala.util.matching.Regex = (\d+) (\w+) scala> val numitemPattern(num, item) = "99 bottles"
num: String = 99
item: String = bottles
6.3 for表达式中的模式
# 打印所有值为空白的键
for ((k, "") <- System.getProperties()) println(k)
由于时间有限,还没能把所有的Scala语法都吃透。但学到现在,从R过渡到Scala算是比较有把握了,继续走在攻克Spark难题的路上。
转载请注明出处:http://logos.name/
R语言码农的Scala学习心得的更多相关文章
- scala学习心得3
在scala中可以定义函数字面量参数,定义方式如下:
- scala学习心得(2)
scala类中可以通过override 重载方法 scala定义的函数式类不可被改变,这样传进去的参数就需要提前被检验,可以通过scala.predef包中的方法require方法 定义辅助构造器 d ...
- scala 学习心得
scala 安装步骤 文件下载地址:www.scala-lang.org(Please report bugs at https://issues.scala-lang.org/. We welcom ...
- 《R语言实战》读书笔记--学习张丹日志
从张丹的日志(http://blog.fens.me/rhadoop-r-basic/)中第九条对象看到R对象的几个总结: 1.内在属性 mode length 所有对象都有的属性 2.外部属性 at ...
- 碎片︱R语言与深度学习
笔者:受alphago影响,想看看深度学习,但是其在R语言中的应用包可谓少之又少,更多的是在matlab和python中或者是调用.整理一下目前我看到的R语言的材料: ---------------- ...
- MxNet+R︱用R语言实现深度学习(单CPU/API接口,一)
MxNet有了亚马逊站台之后,声势大涨,加之接口多样化,又支持R语言所以一定要学一下.而且作为R语言的fans,为啥咱们R语言就不能上深度学习嘞~ -------------------------- ...
- 手把手教你学习R语言
本文为带大家了解R语言以及分段式的步骤教程! 人们学习R语言时普遍存在缺乏系统学习方法的问题.学习者不知道从哪开始,如何进行,选择什么学习资源.虽然网络上有许多不错的免费学习资源,然而它们多过了头,反 ...
- R语言中文社区历史文章整理(类型篇)
R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...
- R语言教程规划
本文发表在博客园, http://www.cnblogs.com/stackworm/ 尽管进展中出现了意想不到的事情,期间中断1个多月,但我仍然会坚持下去. 首先,这份教程适合所有对R语言有兴趣且希 ...
- R语言︱贝叶斯网络语言实现及与朴素贝叶斯区别(笔记)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 一.贝叶斯网络与朴素贝叶斯的区别 朴素贝叶斯的 ...
随机推荐
- 如何创建一个浏览器版的`Window11`
如何创建一个浏览器版的Window11 我们接下来将创建一个在浏览器运行的Window11,可以先看看效果图 这是基于Windows 11 in React修改的功能,我们接下来就将使用Windows ...
- Golang如何快速构建一个CLI小工示例
这篇文章主要为大家介绍了Golang如何快速构建一个CLI小工具详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 如何Golang快速构建一个CLI小工具 在现实开发的 ...
- 微信小程序与微信公众号之间支付问题解决方案
前言 大家好,我是一名对编程有兴趣的小伙子,IT届称我为xiager,工作中叫我jake 就好了,如果此文对你有帮助希望多多关注哦. 准备 微信公众平台 微信支付平台 微信开放平台 一. 小程序 ...
- C#获取各种当前日期时间
我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...
- CF468E Permanent 题解
考虑暴力状压 DP. 按行 DP,记录列哪些被选过,可以做到 \(O(2^kk^2)\). 注意到某一列扫完了之后这一列选没选过不重要,可以减少这里的状态. 简单优化一下,每次选择最少的一列,使这一列 ...
- 解决windows下使用vscode没有函数提示的问题
vscode支持非常多的扩展,包括支持protobuf语法,非常方便. 笔者近期在使用vscode打开工程(文件夹)情况下,困扰于没有函数提示,例如不同路径的头文件中的函数不提示,库函数不提示,试尽各 ...
- Vue2 常见问题汇总及解决方案
参考:https://mp.weixin.qq.com/s/6Wapb1bZLQaYv0zlip6ygg 1.安装超时(install timeout) 方案: cnpm : 国内对npm的镜像版本 ...
- Appium获取元素坐标
文章转自:https://www.cnblogs.com/lfr0123/p/13686769.html appium做app自动化测试过程中,有时需要获取控件元素的坐标进行滑动操作.appium中提 ...
- k8s 删除 node节点
查看现有状态 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plan ...
- js 监听 变量变化
var o = {};setTimeout(function () { o.abb = '2';}, 4000);Object.defineProperties(o, { abb: { configu ...