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]。然而,如果你有一个合适类型的数组,并尝试把它当作重复参数传入会出错

Scala语法笔记的更多相关文章
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- Scala语言笔记 - 第一篇
目录 Scala语言笔记 - 第一篇 1 基本类型和循环的使用 2 String相关 3 模式匹配相关 4 class相关 5 函数调用相关 Scala语言笔记 - 第一篇 最近研究了下scala ...
- 【大数据】Scala学习笔记
第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java 以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...
- Scala编程 笔记
date: 2019-08-07 11:15:00 updated: 2019-11-25 20:00:00 Scala编程 笔记 1. makeRDD 和 parallelize 生成 RDD de ...
- Scala语言笔记 - 第三篇(容器方法篇)
Scala语言笔记 - 第三篇(容器方法篇) 目录 Scala语言笔记 - 第三篇(容器方法篇) map和flapMap方法: 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程( ...
- SQL基础语法笔记教程整理
PS:本文适用SQL Server2008语法. 一.关系型数据库和SQL 实际上准确的讲,SQL是一门语言,而不是一个数据库. 什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- SQL 基础语法笔记教程整理
最近从图书馆借了本介绍 SQL 的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用. PS:本文适用 SQL Server2008 语法. 首先,附一个发现的 MySQL 读书笔 ...
- scala语法在spark withScope上的应用
withSpout在spark中是用来做DAG可视化的,它在代码里的用法如下(以map为例,spark 2.0.0版本) def map[U: ClassTag](f: T => U): RDD ...
随机推荐
- CentOS搭建Httpd Pyhton3 Django环境
系统环境 centos-6-x86 系统自带httpd 编译安装Python3 pip3 参考 http://www.cnblogs.com/vawter/p/6254170.html 编译安装wsg ...
- UVa 1592 数据库(c++pair)
Input Input contains several datasets. The first line of each dataset contains two integer numbersn ...
- JavaWeb学习记录(二十三)——文件上传与下载
一.导入jar包
- Get access to Servlet
import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class LoginServlet extend ...
- [PA2014] [BZOJ 3709]~[BZOJ 3719] 合集
今天起尝试做套题喵~ (当然是因为被最大流的题目弄得恶心死了) 一共是 10 道题一道一道做 预计 3~4 内做完 尽情期待 [BZOJ 3709]Bohater 一眼就能感受到贪心的气息 因为很直观 ...
- Python路径总结
Windows下文件路径的分隔符是'\'反斜杠,文件路径也是一个字符串,牵扯到'\'在Python字符串中存在转义的情况,就对这个问题做一个探究. Python字符串中要使用'\'时有两种方法: 使用 ...
- 论文笔记之:From Facial Parts Responses to Face Detection: A Deep Learning Approach
From Facial Parts Responses to Face Detection: A Deep Learning Approach ICCV 2015 从以上两张图就可以感受到本文所提方法 ...
- feature visualization from ipython notebook
Feature visualization from ipython notebook Wang Xiao 1. install anaconda2 from: https://www.continu ...
- [机器学习之13]降维技术——主成分分析PCA
始终贯彻数据分析的一个大问题就是对数据和结果的展示,我们都知道在低维度下数据处理比较方便,因而数据进行简化成为了一个重要的技术.对数据进行简化的原因: 1.使得数据集更易用使用.2.降低很多算法的计算 ...
- 虚拟化之vmware虚拟机扩容与克隆
前提条件: 1.在新建虚拟机的时候创建磁盘如下图,之后这个磁盘就可以在虚拟机关机状态下动态扩展大小,否则只能通过添加另外一块硬盘的方式来扩容.