scala 基本语法

1.声明变量

(1)val i = 1 使用val声明的变量值是不可变的,相当于java里final修饰的变量,推荐使用。
(2)var i = "hello" 使用var声明的变量值是可变的
(3)val s = "hi" scala编译器会自动推断变量的类型,必要的时候可以指定类型,变量名在前,类型在后

2.常用的类型

Scala和Java一样,有7种数值类型Byte、Char、Short、Int、Long、Float和Double(无包装类型)和一个Boolean类型

3.条件表达式

(1)if else
val s = if(x>1)1 else 2
(2)支持混合类型表达式
val s = if(x>1)1 else "Hello"
(3)在scala中每个表达式都有值,scala中有个Unit类,写作(),相当于java中的void
val n = if(x>2)1 else()
(4)if else if else
val s = if(x>1)1 else if(x=0)0 else -1

4.循环
(1)for循环
for(i <- 1 to 10)
println(i)

1 to 10 表达式1 to 10返回一个Range(区间)所有1到10之间的数值,println打印i的值

(2)高级for循环
for(i <- 1 to 3;j <-1 to 3 if i!=j){
print(i+j)
}

先会循环i的值(i=1)在循环j的值,将j的值全部循环完毕后,再此循环i的值(i=2),在此循环j的所有的值

(3)for推导式:如果for循环的循环体以yield开始,则该循环会构建出一个集合
val v = for (i <- 1 to 10) yield i * 10
println(v)

5.调用方法和函数

Scala中的+ - * / %等操作符的作用与Java一样,位操作符 & | ^ >> <<也一样。只是有
一点特别的:这些操作符实际上是方法。例如:
a + b
是如下方法调用的简写:
a.+(b)
a 方法 b可以写成 a.方法(b)

6.定义方法

def m(x: Int,y: Int):Int{
x*y
}

def 定义方法的关键字
m 定义方法的名称
x: Int,y: Int 定义方法的参数列表,两个Int类型的参数
:Int 方法返回的参数类型
x*y 方法的具体执行内容,定义对参数x和y的操作

方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型

7.定义函数

val f1=(x:Int, y_int )=>{x*y}

8.将方法转换成函数

val f2 = m _

9.定长数组

(1)初始化一个长度为8的定长数组,其所有元素均为0
val arr1 = new ArrayInt
(2)直接打印定长数组,内容为数组的hashcode值
println(arr1)
(3)将数组转换成数组缓冲,就可以看到原数组中的内容了 ,toBuffer会将数组转换长数组缓冲
println(arr1.toBuffer)
(4)如果不new,相当于调用了数组的apply方法,直接为数组赋值
初始化一个长度为1的定长数组
val arr = ArrayInt
(5)定义一个长度为3的定长数组
val arr3 = Array("hadoop", "storm", "spark")
(6)使用()来访问元素
println(arr3(2))

10.变长数组(数组缓冲)

(1)定义如果想使用数组缓冲,需要导入import scala.collection.mutable.ArrayBuffer包
val ab = ArrayBuffer[Int]()
(2)向数组缓冲的尾部追加一个元素
ab += 1
(3)追加多个元素
ab += (2, 3, 4, 5)
(4)追加一个数组++=
ab ++= Array(6, 7)
(5)追加一个数组缓冲
ab ++= ArrayBuffer(8,9)
(6)在数组某个位置插入元素用insert
ab.insert(0, -1, 0) 在数组0的位置前面插入-1和0
(7)删除数组某个位置的元素用remove
ab.remove(3, 2) 移除数组3位置的后面两个元素

11.循环数组

(1)用until会生成脚标,0 until 10 包含0不包含10
0 until 10
res6: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
(2)for循环
val arr = Array(1,2,3,4,5,6,7,8)
for(i <- arr)
println(i)
i接收arr循环过程中的每一个元素
(3)用until生产一个Range,使用reverse是将前面生成的Range反转
for(i <- (0 until arr.length).reverse)
println(arr(i))

12.数组转换

(1)val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
arr.map(_ *2)
转换成为一个新的数组,每个元素乘以2,map是循环得到每个元素,_ 是对每个循环中元素的匿名引用
(2)filter是过滤,接收一个返回值为boolean的函数
val r = arr.filter(_ % 2 == 0)
过滤出所有的偶数

13.数组常用算法

(1)数组求和(arr为自定义的一个数组)
arr.sum
(2)数组最大值
arr.max
(3)数组排序 (默认是正序)
arr.sorted

14.映射(java中的Map)
在Scala中,有两种Map,一个是immutable包下的Map,该Map中的内容不可变;另一个是mutable包下的Map,该Map中的内容可变

不可变map
(1)构建映射
用箭头的方式构建Map
val m = Map("a" -> 11,"b" ->12 ,"c" -> 13)

用元组的方式构建Map
val m = Map(("a",11),("b",12),("c",13))
(2)获取映射中的值
m("a")
(3)getOrElse
当m("e")的时候因为e这个key不存在所以会报错,使用m.getOrElse("e",0)当e不存在时返回默认值0

可变map
(1)构建
import scala.collection.mutable.Map
val m1 = Map("a" -> 111,"b" ->112 )

val修饰是不可变的,不可变的是对Map的引用,Map中打的元素是可以改变的
(2)修改map中的内容
m1("a")=88
(3)用+=号向原来的map中追加元素
m1+=("c" ->55)

15.元组
定义元祖时用小括号将多个元素包起来,元素之间用逗号分隔,元素类型可以不一样,元素类型可以任意多个

(1)定义元组
val y = ("a",3.14,111)
(2)获取元组中的值
val r = y._1
r="a"
获取元组中的值使用下划线加角标(_1)元组中的元素角标是从1开始的

(3)将对偶的集合转换成为映射
val arr = Array(("a",88),("b",66))
arr.toMap

Array(("a",88),("b",66))位对偶的集合
toMap可以把对偶的集合转换成为映射

(4)拉链操作
val names = Array("a","b","c")
val s = Array(1,2,3)
val ns = names.zip(s)
ns: Array[(String, Int)] = Array((a,1), (b,2), (c,3))

将names的每一个元素和s中的每一个元素组成元组放入到Array中

16.集合

(1)创建一个不可变的集合
val lst1 = List(1,2,3)
(2)将0插入到lst1的前面生成一个新的List
val lst2 = 0 :: lst1

:: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

(3)将一个元素添加到lst1的后面产生一个新的集合
val lst6 = lst1 :+ 3
(4)将2个list合并成一个新的List
val lst7 = lst1 ++ lst6
(5)将lst0插入到lst1前面生成一个新的集合
val lst9 = lst1.:::(lst0)

可变的序列
(1)构建一个可变列表,初始有3个元素1,2,3
val lst0 = ListBuffer[Int](1,2,3)
(2)向lst1中追加元素,注意:没有生成新的集合
lst1 += 4
lst1.append(5)
(3)将lst1中的元素最近到lst0中, 注意:没有生成新的集合
lst0 ++= lst1

17.Set

不可变的Set
(1)定义set
import scala.collection.immutable.HashSet
val set1 = new HashSet[Int]()
(2)将元素和set1合并生成一个新的set,原有set不变
val set2 = set1 + 4

可变的Set
(1)创建一个可变的HashSet
import scala.collection.mutable
val set1 = new mutable.HashSet[Int]()
(2)向HashSet中添加元素
set1 += 2
//add等价于+=
set1.add(4)
set1 ++= Set(1,3,5)

(3)删除一个元素
set1 -= 5
set1.remove(2)

18.Map

(1)创建一个map
import scala.collection.mutable
val map1 = new mutable.HashMap[String, Int]()
(2)向map中添加数据
map1("spark") = 1
(3)从map中移除元素
map1.remove("spark")

19.单词统计

val lines = List("hello tom hello jerry", "hello jerry", "hello kitty")

实现1:

lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2))

分析:

(1)lines.flatMap(_.split(" ")) 将集合中的单词进行压平,其中每个元素通过" "来切分

lines.flatMap(_.split(" "))后为
res17: List[String] = List(hello, tom, hello, jerry, hello, jerry, hello, kitty)

(2)lines.flatMap(_.split(" ")).map((_, 1))统计每一个单词出现的次数,出现一次计数1
执行后为
res18: List[(String, Int)] = List((hello,1), (tom,1), (hello,1), (jerry,1), (hel
lo,1), (jerry,1), (hello,1), (kitty,1))

(3).groupBy(_._1)将集合进行分组,分组是按照集合中每一个元组如(hello,1)的第一个单词(_._1)进行分组

分组后为一个map:

res19: scala.collection.immutable.Map[String,List[(String, Int)]] = Map(tom -> L
ist((tom,1)), kitty -> List((kitty,1)), jerry -> List((jerry,1), (jerry,1)), hel
lo -> List((hello,1), (hello,1), (hello,1), (hello,1)))

(4).mapValues(_.foldLeft(0)(_+_._2)) 获取map中的所有values如 List((tom,1)),foldLeft进行统计,(0)初始化参数为0,_+_._2进行求和,第一个_在循环时可能为初始化参数和进行求和后的值

执行后为:
res20: scala.collection.immutable.Map[String,Int] = Map(tom -> 1, kitty -> 1, je
rry -> 2, hello -> 4)

实现2:

lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).map(t=>(t._1, t._2.size)).toList.sortBy(_._2).reverse

scala基本语法和单词统计的更多相关文章

  1. Scala基础语法 (一)

    如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...

  2. 2、 Spark Streaming方式从socket中获取数据进行简单单词统计

    Spark 1.5.2 Spark Streaming 学习笔记和编程练习 Overview 概述 Spark Streaming is an extension of the core Spark ...

  3. Scala进阶之路-Scala高级语法之隐式(implicit)详解

    Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...

  4. 1.scala基础语法总结

    Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...

  5. spark复习笔记(3):使用spark实现单词统计

    wordcount是spark入门级的demo,不难但是很有趣.接下来我用命令行.scala.Java和python这三种语言来实现单词统计. 一.使用命令行实现单词的统计 1.首先touch一个a. ...

  6. Spark入门(三)--Spark经典的单词统计

    spark经典之单词统计 准备数据 既然要统计单词我们就需要一个包含一定数量的文本,我们这里选择了英文原著<GoneWithTheWind>(<飘>)的文本来做一个数据统计,看 ...

  7. MapReduce 单词统计案例编程

    MapReduce 单词统计案例编程 一.在Linux环境安装Eclipse软件 1.   解压tar包 下载安装包eclipse-jee-kepler-SR1-linux-gtk-x86_64.ta ...

  8. ytu 2002:C语言实验——单词统计(水题)

    C语言实验——单词统计 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 61  Solved: 34[Submit][Status][Web Board] ...

  9. hive学习之WordCount单词统计

    看hive目录下就可以了,程序在hdfs里创建一个hive的大文件夹,相当于数据库吧.上面就是一个完整的利用hive来做单词统计,其中的优劣也能看出一点.

随机推荐

  1. opencv学习笔记(五)

    线性滤波 方框滤波--boxblur函数 均值滤波(邻域平均滤波)--blur函数 高斯滤波--GaussianBlur函数 中值滤波--medianBlur函数 双边滤波--bilateralFil ...

  2. 在VS2017上对C++项目进行单元测试

    操作系统:win10 VS2017安装:http://www.cnblogs.com/Metak/p/7471671.html 参考博客: http://blog.csdn.net/lovehaiho ...

  3. XMLHttpRequest.withCredentials

    https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials var xhr = new XMLHtt ...

  4. redux的源码解析

    一. redux出现的动机 1. Javascript 需要管理比任何时候都要多的state2. state 在什么时候,由于什么原因,如何变化已然不受控制.3. 来自前端开发领域的新需求4. 我们总 ...

  5. 通过Oracle DUMP 文件获取表的创建语句

    1. 有了dump文件之后 想获取表的创建语句. 之前一直不知道 dump文件能够直接解析文件. 今天学习了下 需要的材料. dump文件, dump文件对应的schema和用户. 以及一个版本合适的 ...

  6. [读书笔记]SQLSERVER企业级平台管理实践读书笔记01

    1. SQLSERVER信息收集 SQLDIAG 使用界面 C:\Users\Administrator>sqldiag2018/01/02 08:13:26.10 SQLDIAG Collec ...

  7. centos7 修改网络配置问题

    ip adr 查看ip 查看报错详细信息 journalctl -xe 查看网络故障命令 cat /var/log/messages |grep network 报错现象 Error: Connect ...

  8. 在使用ADOQuery删除数据时的处理 [问题点数:100分,结帖人isdxsc]

    在使用ADOQuery删除数据时的,希望在他的事件BeforeDelete进行一些判断,符合要求的进行删除,不符合要求的终止这个删除行为,请问应该用什么语句呢?还有个比较奇怪的现象也一起请教:DBGr ...

  9. Java 数组实现 stack

    首先定义 IStack package cn.com.example.stack; /** * Created by Jack on 2017/3/8. */ public interface ISt ...

  10. caffe中的lr_policy

    // The learning rate decay policy. The currently implemented learning rate // policies are as follow ...