scala学习笔记-类和类型

2019-11-15  本文已影响0人  cclucc

简单的说,类(class)与类型(type)是两个不一样的概念(在java里因为早期一直使用class表达type,并且现在也延续这样的习惯);类型(type)比类(class)更”具体”,任何数据都有类型。类是面向对象系统里对同一类数据的抽象,在没有泛型之前,类型系统不存在高阶概念,直接与类一一映射,而泛型出现之后,就不在一一映射了。比如定义class List[T] {}, 可以有List[Int] 和 List[String]等具体类型,它们的类是同一个List,但类型则根据不同的构造参数类型而不同。

scala中的lambda表达式
def hf(f:String=>Unit) = f("higher")

hf(s=>println(s))//省略了s的类型,因为hf中已经声明了类型为string=>Unit,编译器会把出参和入参按照声明的类型来对待
hf(println(_)) //采用了占位符形式,对于所有的 x=>g(x) 都可以用占位符的形式写为:g(_)。省略了入参和箭头
hf(println)//省略了参数。。。编译器支持lambda的“eta转换”(可以参考之前的文章scala中的eta-conversion)。简单的说就是对于lambda表达式中只有一个参数,并且箭头右边的逻辑是对入参执行一个函数:即 x => f(x),则可以简写为f

scala的小括号和花括号
List(2).map( case 2 => "OK" )//编译失败
List(2).map{ case 2 => "OK" }//编译成功

why????!!!
首先明白,花括号在scala中的用法
1)、scala里面大小括号并不是一回事儿,虽然说很多时候可以替换。大括号之所以在小括号的地方能使用,是因为该小括号仅需一个参数,故小括号可以省略,而大括号的内容最后会被evaluate成一个结果,并作为小括号的参数给予传递。两个参数的小括号就无法直接用大括号替代。
2)、对于只有一个参数的方法,其小括号是可以省略的,map(lambda)可写为 map lambda,即这块{case 2 => "OK"} 连同花括号整体是一个lambda(函数字面量)。

上一篇下一篇

猜你喜欢

热点阅读