Scala语法笔记

JAVA中,举例你S是一个字符串,那么s(i)就是该字符串的第i个字符(s.charAt(i)).Scala中使用apply的方法

JAVA与C++的?:操作符 等同于Scala的

if ( x > 0)  1 else -1

x>0 ? 1: -1 //JAVA或C++

在Scala中,每个表达式都有一个类型,如下:

if ( x > 0) "positive" else -1

其中一个分支是java.lang.String 而另一个分支是Int,他们的公共超类型是Any

使用如下会报错:

if(x > 0) 1 else if( x == 0) 0 else -1

改为

if(x > 0){ 1 }else if (x== 0) 0 else -1

高级for 循环  可以使用变量<- 表达式 的形式提供多个生成器,用分号将其隔开

如果for循环的循环体以yield开始,则循环会构造出一个结合,每次迭代生成集合中的一值:

每个生成器都自带一个守卫,以if开头的Boolean表达式

可以任意多的定义,引入可以在循环中使用变量

定义函数:Scala一般不需要声明返回值类型,会自己推断,但使用递归的时候 必须指定返回类型:

默认参数和带名参数(什么鬼,Java的思想被颠覆)

过程,Scala对于不返回值的函数有特殊的表示语法,如果函数体包含在花括号中但没有前面的=号,那么返回类型就是Unit

或def box(s : String) : Unit = { ...} 显示声明Unit返回类型

数组:

声明一个空的数组缓冲,用+=在尾端添加元素,用()而不是用{} 移除用trimEnd

也可在任意位置插入或移除元素 其中remove方法第二个参数为要删除多少个

遍历数组 使用的是until ,它属于RichInt类的方法,返回所有小于(但不包括)上限的数字。

常用算法

使用sum方法,元素类型必须是数值类型,要么是整型,要么是浮点型或者integer,decimal

sorted方法将数组或数组缓冲排序并返回经过排序的数组或数组缓冲

val b = ArrayBuffer(1, 7, 2, 9) val bSorted = b.sorted(_ < _)

如果要显示数组或数组缓冲的内容,可以用mkString方法,它允许你指定元素之间的分隔符。toString返回的值就无意义了

使用List 使用:: 把一个新元素组合到已有List的最前端,然后返回结果List

使用元组Tuple:

与列表一样,元组也是不可变的,但与列表不同,元组可以包含不同类型的元素。而列表应该是List[Int]或List[String]的样子,元组可以同时拥有Int和String。元组很有用,比方说,如果你需要在方法里返回多个对象。Java里你将经常创建一个JavaBean样子的类去装多个返回值,Scala里你可以简单地返回一个元组。而且这么做的确简单:实例化一个装有一些对象的新元组,只要把这些对象放在括号里,并用逗号分隔即可。一旦你已经实例化了一个元组,你可以用点号,下划线和一个基于1的元素索引访问它.

使用Set和Map

创建,初始化和使用可变集合

Map是Scala里另一种有用的集合类。和集一样,Scala采用了类继承机制提供了可变的和不可变的两种版本的Map,,Map的类继承机制看上去和Set的很像。scala.collection包里面有一个基础Map特质和两个子特质Map:可变的Map在scala.collection.mutable里,不可变的在scala.collection.immutable里。

函数式风格:

import scala.collection.mutable.Map

更函数式的方式应该是定义对需打印的arg进行格式化的方法,但是仅返回格式化之后的字串

集合类型的filter方法

val a = List(-11,-10,-5,0,5,10)

someNumber.foreach((x:Int) =>println(x))

someNumber.filter((x:Int) => x>0)

结果:res6: List[Int] = List(5,10)

短格式:

someNumbers.filter((x) => x>0)

结果:res7: List[Int] = List(5,10)

占位符语法:如果想让函数文本更简洁,可以把下划线当做一个或更多参数的占位符,只要每个参数在函数文本内仅出现一次。比如,_ > 0对于检查值是否大于零的函数来说就是非常短的标注:

someNumbers.filter(_>0)

你可以把下划线看作表达式里需要被“填入”的“空白”。这个空白在每次函数被调用的时候用函数的参数填入。例如,由于someNumbers在第115页被初始化为值List(-11, -10, -5, 0, 5, 10),filter方法会把_ > 0里的空格首先用-11替换,就如-11 > 0,然后用-10替换,如-10 > 0,然后用-5,如-5 > 0,这样直到List的最后一个值。因此,函数文本_ > 0与稍微冗长一点儿的x => x > 0相同

使用冒号指定类型:

val f = (_: Int) + (_ : Int)

f(5,10)

偏应用函数

someNumbers.foreach(println _)

Scala把这种短格式直接看作是你输入了下列代码:

someNumbers.foreach(x => println(x))

闭包:不带自由变量的函数文本,如(x: Int) => x + 1,被称为封闭术语:closed term,这里术语:term指的是一小部分源代码。因此依照这个函数文本在运行时创建的函数值严格意义上来讲就不是闭包,因为(x: Int) => x + 1在编写的时候就已经封闭了。但任何带有自由变量的函数文本,如(x: Int) => x + more,都是开放术语:open term。因此,任何依照(x: Int) => x + more在运行期创建的函数值将必须捕获它的自由变量,more,的绑定。由于函数值是关闭这个开放术语(x: Int) => x + more的行动的最终产物,得到的函数值将包含一个指向捕获的more变量的参考,因此被称为闭包。

直觉上,Scala的闭包捕获了变量本身,而不是变量指向的值

重复参数

Scala允许你指明函数的最后一个参数可以是重复的。这可以允许客户向函数传入可变长度参数列表。想要标注一个重复参数,在参数的类型之后放一个星号

函数内部,重复参数的类型是声明参数类型的数组。因此,echo函数里被声明为类型“String*”的args的类型实际上是Array[String]。然而,如果你有一个合适类型的数组,并尝试把它当作重复参数传入会出错

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

Java中方法重写的两个面试题

  方法重写:     在子类中,出现和父类中一模一样的方法声明的现象。(包含方法名、参数列表和返回值类型都一样)   方法重载:     同一...

33210
来自专栏微信公众号:Java团长

浅谈Java中的equals和==

  为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些...

10330
来自专栏一“技”之长

深入理解JavaScript函数 原

    从功能上理解,函数是一组可以随时运行的语句,是一段代码块,也是所谓的子程序。在JavaScript中,函数实质上也是一种对象,是Function对象。函...

7410
来自专栏java一日一条

浅谈Java中的equals和==

为什么第3行和第4行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些低级...

7020
来自专栏小樱的经验随笔

C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)

下面来进行这段代码的分析: struct node {  //定义一个结构体node(节点) int x; int y; int len;   //nod...

35260
来自专栏机器学习算法与Python学习

python: sort, sorted, reverse

python语言中的列表排序方法有三个:reverse反转/倒序排序、sort正序排序、sorted可以获取排序后的列表。在更高级列表排序中,后两中方法还可以加...

38980
来自专栏Java 源码分析

静态内部类

定义:静态内部类,定义在类中,任何方法外,用static定义;静态内部类只能访问外部类的静态成员。 注意点: 一般情况下,如果一个内部类不是被定义成静态内部类,...

33780
来自专栏ShaoYL

结构体

424130
来自专栏前端杂货铺

new的探究

new操作符易用,但是往往容易忽略对其的理解。 var foo= new Foo(); 这个简单的语句,涉及到了一系列的步骤:   1),给对象开辟内存,即 v...

358110
来自专栏十月梦想

变量和常亮

在函数内,变量的使用需要声明常量的作用域globay变量名(全局作用)local(局部)static(静态)

8720

扫码关注云+社区

领取腾讯云代金券