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. 基于SSH实现员工管理系统之框架整合篇

    本篇文章来源于:https://blog.csdn.net/zhang_ling_yun/article/details/77803178 以下内容来自慕课网的课程:基于SSH实现员工管理系统之框架整 ...

  2. ubuntu在windows下的wubi安装

    转自:http://mp.weixin.qq.com/s?__biz=MjM5NjYxNjU0OQ==&mid=200664819&idx=2&sn=25719890570b1 ...

  3. cmd常用

    npm install -g npm              npm就自动为我们更新到最新版本 npm install -g cnpm --registry=https://registry.npm ...

  4. Java微信二次开发(三)

    各种类型消息的封装 第一步:找到com.wtz.message.response包,新建类Image.java package com.wtz.message.response; /** * @aut ...

  5. 研究VCL源码的原因和起点

    ---恢复内容开始--- 研究VCL源码的原因和起点 根本原因:当然是希望自己成为Delphi高手,因为这么多年过去,觉得自己始终不得要领,修改一个控件都无从下手,一直都只是个会拖控件的白痴.而我却拥 ...

  6. js 算數(Math)對象

    算數對象不需要聲明,可以直接使用, Math對象方法及作用: round()四捨五入: random()生成0到1的隨機數: max()選擇較大的數: min()返回較小的數:

  7. Java之反射举例

    package reflection; import bean.User; public class ReflectionDemo { public static void main(String[] ...

  8. [转载]使用VS2015搭建Lua开发环境

    参考原文请看: Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一) Lua学习笔记2:Windows7下使用VS2015搭建Lua开发环境(二) 本篇主要分以下几个部分: 一 ...

  9. BZOJ4229选择——LCT+并查集+离线(LCT动态维护边双连通分量)

    题目描述 现在,我想知道自己是否还有选择. 给定n个点m条边的无向图以及顺序发生的q个事件. 每个事件都属于下面两种之一: 1.删除某一条图上仍存在的边 2.询问是否存在两条边不相交的路径可以从点u出 ...

  10. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...