`

关于scala搞出的新概念和语法糖

阅读更多
对于scala搞那么多语法糖和新概念真是又爱又恨。爱的是scala引入的函数式编程特性,这对于使用高阶函数抽象来处理集合数据非常有爱(spark简洁的RDD处理得益于此)。恨的是scala搞那么多的新概念和语法糖。

下面就来说说这些个语法糖和新概念:

一、单例对象(singleton object)

scala没有static关键字,搞出了个object关键字来新建单例对象。在单例对象中的成员都是static的。所以要写util类一般都要用这个东西。
object xxUtil{
   def process(xx:String):String = {
     xx
   }
}

二、伴生对象和伴生类(companion object & companion class)、独立对象(standalone object)

这两个概念是相互的。假设有object A 和 class A 两个同名了。这时候就可以说:object A是class A的“伴生对象”;class A是object A的“伴生类”。当一个object B没有同名的class B的时候,object B就叫“做独立对象”。

伴生带来的特权就是:它们可以互相访问私有成员。

class和object的区别:
  1、单例对象不能用new来初始化。
  2、单例对象不能带参数。
  3、单例对象在第一次调用的时候才初始化。

三、略坑的函数调用语法糖

1、神奇的点号省略。

虽然有的时候带来一定方便,不过组合lambda特性等东西,代码简直就能亮瞎你的氪金狗眼。
//无参数
"hello" toUpperCase
"hello".toUpperCase
"hello".toUpperCase()
//一个参数
"hello".indexOf "h"
"hello" indexOf "h" 
//多个参数
"hello world" substring (0, 3) 
//全部搞在一起
 "hello world" substring (0, 3)  toUpperCase() indexOf "h"
//配合上匿名函数
Array(1,2,3) map ((i:Int)=> i+1)
 1 to 3 map ((i:Int)=> i+1)

2、神奇的for
//这个for挺正常的吧?
for(i <- 1 to 4) println(i)
//这个呢!
 for(i <- 1 to 4 if i > 1) println(i)
//这个呢!!!
 for(i <- 1 to 4 if i > 1; if i < 4; if i % 2 ==0) println(i)

3、神奇的花括号{}代替小括号()语法

据说,如果函数调用只传入一个参数,花括号可以代替小括号,scala粑粑不会打你屁股。
println("hello")
println{"hello"}

def xx(i:Int)(j:Int) = i+j
 xx(1){2} //result: 3
(xx(1)_){3} //curry化调用
(xx(1)_)(3) //curry化调用,不信你不懵

//看了上面的还没懵?那就再来个
def xx(i:Int)(j:(Int)=>Int) = j(i)
xx(1){i=> i+10}

//有爱的一面
//假设我定义一个hbase的scan方法
def scan(tableName:String, cf:String, startRow:String, stopRow:String)(processFn:(Result)=>Unit) = {
  //...
}
//那么我可以这么自然的调用
scan(t1, cf, startRow, stopRow){ r =>
   //TODO process result
}

4、神奇的byName函数和调用

为了让自己定义的方法看起来和scala内建语法一样“和谐”,搞出了一个byName参数和byName函数。
//抄袭scala编程的例子
 def myAssert(pred:()=>Boolean) = if(!pred()) throw new AssertionError
myAssert(()=> 5<3) //()=> 5<3匿名函数看起来是不是不爽?

//因为()=> 5<3 的调用看起来不自然。所以要将()这部分去掉。
 def myAssert2(pred: =>Boolean) = if(!pred) throw new AssertionError
myAssert2(5<3) // 这样看起来爽多了。

四、类型的上下界

class foo[T <% A]{...} //弱上界<%。关系较弱:T能够隐式转换为Ordered[T]
class foo[T <: A]{...} //上界 <:。T必须是A的子类,A是T的类型上界。
class foo[T >: A]{...} //下界 >:。T必须是A的父类,A是T类型的下界。

五、协变和逆变

+T: 协变:class Queue[+T] {}。如果C<:A,则Queue[C] <: Queue[A] 
-T: 逆变 : class Queue[-T] {}。如果C<:A,则Queue[C] >: Queue[A]

六、隐式转换

隐式转换,是对应于显式的转换来说的。比如有"1234".toInt,这就是显式的转换,不直接调用toInt方法转换的就是隐式转换。

implicit def str2Int(s:String):Int = Integer.parseInt(s) //隐式str转int
def add(a:Int, b:Int) = a+b
add("1",2) //先把"1"隐式转换为1,再加起来。

七、case类

case类是什么,case类就是一个class,可是能用来做模式匹配。所以搞出这么个东西。。。

case类和一般类的不同点:
1、会有和类名一样的工厂方法。不需要使用new来创建这个类对象。
case class Var(name:String)
val v1 = Var("peter") //和类名一样的工厂方法

2、case类的参数列表默认是val的。
3、自动添加了toString,hashCode和equals的自然实现。

case类的最大的用途就是用来做模式匹配。
case class Var(name:String)
val v1 = Var("peter")
v1 match {
   case Var(name) => name
   case _ =>
}
//匹配出name为peter

八、模式守卫

模式守卫(pattern guard)接pattern之后,开始与if。只有模式守卫返回true才算成功。
10 match {
  case n:Int if 1< n => println(n) //if到=>之前,这段为模式守卫
  case _ =>
}

分享到:
评论
3 楼 yhxf_ie 2018-05-30  
Scala真好玩啊 
2 楼 TerrorM-eye 2017-02-21  
引用
神奇的花括号{}代替小括号()语法

那个让我想起了spark里面用到的
def ... = withScope {
    // ...
}
1 楼 u012896872 2016-09-11  
不错,有收获。

相关推荐

    Scala语法入门.pdf

    虽然Scala是基于Java的,但Scala提供了一套与Java不同的语法和类库,这要求学习Scala的开发者了解其与Java的相同点和不同点。 为了使用Scala进行开发,需要进行环境搭建。这包括安装Java开发工具包(JDK)版本1.8或...

    快学 scala 语法大全

    此文档是scala的语法大全,一共分为22章,控制结构,特质,高阶函数,集合,模式匹配,样例类,解析,actor等都包括在内。

    Scala语法简明教程

    - **面向对象+函数式编程**:Scala融合了面向对象编程和函数式编程的特性,支持类、对象和继承的同时也支持高阶函数、不可变性等函数式编程的核心概念。 - **分布式运行**:Scala设计之初就考虑到了并行和分布式...

    scala 语法参考中文pdf

    《Scala语言规范 2.7版》是Scala的官方文档之一,它详细阐述了Scala的语法结构、类型系统、控制结构、类和对象的定义、模式匹配、函数和闭包等核心概念。在2.7版本中,Scala引入了若干创新特性,例如: 1. **类型...

    Dotty是Scala的下一代编译器也是Scala的新语言概念和编译器技术研究平台

    这个项目不仅是一个编译器,而且是一个研究平台,用于探索和实验Scala语言的新特性和编译器技术。Dotty的出现是为了解决Scala早期版本中的一些复杂性和不一致性问题,以提供更清晰、更简洁的编程体验。 在深入探讨...

    Notepad++里设置scala的语法高亮(包含使用说明)

    在编程世界中,文本编辑器是开发者不可或...不过,记得定期检查和更新Scala的语法文件,以确保与最新的语言特性保持同步。希望这个教程能帮助到那些喜欢Notepad++并且使用Scala的开发者们,让你们的编码旅程更加愉快。

    Swift和Scala语法的比较

    不过Scala的类型系统更加强大和复杂,支持协变、逆变等概念。 Swift的子脚本语法允许通过指定索引来访问对象,使用get和set关键字定义读写访问器。Scala则使用`def`和`def_=`定义子脚本的获取和设置方法。 总结: ...

    dotty, 面向 Scala的新语言概念和编译技术研究平台.zip

    dotty, 面向 Scala的新语言概念和编译技术研究平台 社区构建: 主页文档文档试试要在项目中尝试它,请参见启动用户指南 。运行时代码Dotty使用 Scala 代码进行所有通信和讨论。 这包括 GitHub 。Gitter聊天和其他更...

    scala sdk scala-2.12.3

    通过学习和使用Scala SDK,开发者可以利用其丰富的语言特性来构建复杂的软件系统,尤其是在大数据处理、Web应用、云计算等领域,Scala已经展现出了强大的生命力。例如Apache Spark,一个流行的分布式计算框架,就是...

    scala3 scala3 scala3 scala3 scala3

    新的Typelevel Scala项目引入了更强大的类型系统,允许编译器更加智能地推断变量和函数的类型,减少了程序员在代码中显式声明类型的需要。例如,`given` 关键字用于提供上下文实例,这在类型类和依赖类型推断中特别...

    Scala基础语法课件汇总整本书电子教案全套课件完整版ppt最新教学教程.pptx

    Scala 基础语法课件汇总整本书电子教案全套课件完整版ppt最新教学教程 以下是根据给定的文件信息生成的相关知识点: Scala 介绍 Scala 是一种多范式的编程语言,由 Federico Mena 和 Martin Odersky 于 2001 年...

    最新scala-ide

    首先,Scala 是一种多范式编程语言,融合了面向对象和函数式编程的概念。它的语法简洁且强大,能够处理复杂的数据结构和算法。使用 Scala IDE,开发者可以利用其强大的编辑器特性,如智能感知和自动完成,快速地编写...

    monadless:Scala中用于monad组成的语法糖

    总结来说,Monadless是Scala中一个提升Monad使用体验的库,它通过提供语法糖简化了Monad的使用,使开发者在处理副作用、异步操作时能保持代码的清晰和简洁。配合Cats、ScalaJS和Monix等库,可以在各种场景下发挥更大...

    scala2.1.2最新安装包

    对于初学者来说,理解Scala的基础语法和核心概念至关重要,如变量定义、类和对象、模式匹配、函数和高阶函数、集合操作等。同时,熟悉Apache Spark的API和使用Scala编写Spark程序也是必不可少的技能。通过学习和实践...

    scala学习源代码

    让我们深入了解一下Scala语言的关键概念和特性。 首先,Scala运行在Java虚拟机(JVM)上,这意味着它可以无缝地与Java库集成,同时也享受到了JVM的高性能和跨平台兼容性。它的语法设计简洁而富有表达力,使得代码...

    scala2.12.1Windows镜像包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala2.12.1Windows镜像包"是为Windows操作系统设计的Scala编程环境的安装包,版本号为2.12.1。Scala 2.12.x系列是其重要的一个稳定...

    第3讲-Scala编程详解:基础语法.rar

    在这里,你可以立即看到代码执行的结果,这对于学习和理解新概念非常有用。 4. 声明变量 在Scala中,变量声明有两种类型:val和var。`val`用于声明不可变变量,一旦赋值后不能更改;而`var`则是可变变量,可以在...

    Scala最新官方下载包(官方的下载真的慢)

    Scala是一种强大的多范式编程语言,它融合了面向对象编程和函数式编程的概念。这个"Scala最新官方下载包(官方的下载真的慢)"是指Scala的2018.1.8版本,发布于2018年3月26日,兼容的构建版本为181至182。在那个时候...

Global site tag (gtag.js) - Google Analytics