Scala是我“感兴趣的”
我想要使用scala的初衷是我一个学习的项目是用spark实现一个实时推荐的模块。在深入学习spark时,深感机器学习封装成包的便捷,同时,也为做数据处理用DataFrame那独特的语法所困扰,所以想要系统学习Scala这门语言。初期计划观看讲解视频以及书籍《Programming Scala》同步学习。
Scala据说是“富有魅力的”
- 是运行在JVM和JavaScript之上的语言
- 拥有静态类型
- 混合式编程范式——面向对象编程。在Scala眼里,一切都是对象
- 混合式编程范式——函数式编程
- 复杂的类型系统
- 简洁、优雅、灵活的语法
- 可扩展的架构
Scala适应当前时代。当前我们会遇到很多技术挑战,如大数据、通过并发实现高扩展性、提供高可用并健壮的服务。Scala语法简洁但却富有表现力,能够满足这些技术挑战。在享受Scala最先进的 语言特性的同时,你还可以拥有成熟的JVM、库以及生产工具给你带来的便利。
《Programming Scala》
实现Scala的“Hello World”
运行的环境:REPL
程序
class Upper{
def upper(strings:String*):Seq[String]={
strings.map((s:String) => s.toUpperCase())
}
}
val up = new Upper
println(up.upper("Hello","World"))
发现一个问题:在用REPL时貌似每一行开头都不能有空格?易读性较差
解释一下每一行代码的含义
class Upper{}
定义一个Upper类,类的成员和方法在{}内
def upper(strings:String*):Seq[String]={}
- def是定义方法的关键字。
- (strings:String*)指的是可选的参数列表,strings是输入参数名,String*那个“*”代表的是可以输入多个字符串,它们之间用逗号隔开,例如程序中的up.upper(“Hello”,”World”)。
- Seq[String]是“可选的”返回类型,因为有时候,Scala能够自己推导出返回类型。Seq(代表Sequence)是集合的一种抽象,代表着“某类事物的序列”,跟Java中的泛型类似。Scala使用方括号([…])表示参数类型
我感觉最难的地方来了
strings.map((s:String) => s.toUpperCase())
函数方法体中对字符串集合调用了map方法,map方法的输入参数为函数字面量。而这些函数字面量便是“匿名”函数。在其他语言中,它们也被称为Lambda、闭包、块或过程。
在这个示例中,我们向map方法传递了下列函数字面量:(s:String) => s.toUpperCase()。此函数字面量的参数表中只包含了一个字符串参数s。它的函数体位于箭头=>之后(UTF8也允许使用=>)。该函数体调用了s的UpperCase()方法。此次调用的返回值会自动被这个函数字面量返回。在Scala中,函数或方法中把最后一条表达式的返回值作为自己的返回值。
我们对序列对象strings调用了map方法,该方法会把每个字符串依次传递给函数字面量,并将函数字面量返回的值组成一个新的集合。举个例子,假如在原先的列表中有五个元素,那么新生成的列表也将包含五个元素。
运行结果
该进程序,简化代码
object Upper{
def upper(strings:String*)=strings.map(_.toUpperCase())
}
println(Upper.upper("Hello","World"))
代码解释
object Upper
这里直接定义了一个单例对象?我的理解就是一个对象可以直接用的
map(_.toUpperCase())
map方法接受单一函数参数,而单一函数也只接受单一参数。在这种情况下,函数体只使用一次该参数,所哟我们使用占位符_来替代命名参数。也就是说:_起到了匿名函数的作用,在调用toUpperCase方法之前,_将被字符串替换。Scala同时也为我们推断出了该变量的类型为String类型。