scala总结

http://www.runoob.com/scala/scala-basic-syntax.html
API文档:https://www.scala-lang.org/api/current/index.html

scala的配置

mv scala-2.11.7 scala                   # 重命名 Scala 目录
mv /download/scalapath /usr/local/share # 下载目录需要按你实际的下载路径
vi ~/.bash_profile

在文件的末尾加入:
export PATH="$PATH:/usr/local/share/scala/bin"

source ~/.bash_profile

scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181).
Type in expressions for evaluation. Or try :help.

添加source ~/.bash_profile到~/.zshrc文件中

注意:如果在vim /etc/profile中进行配置,可能会无效

Zero、基础语法,数据类型,访问修饰符,运算符,判断语句和循环语句
1.运行Scala文件

有HelloWorld.scala 文件

$ scalac HelloWorld.scala
$ scala HelloWorld.scala

2.scala特性
(纯)面向对象特性
函数式编程
静态类型
扩展性
并发行

3.

一、scala之方法与函数的定义
1.方法
def funcName([参数列表]) :[return type] = {
funcBody
return [expr]
}

例子:
在object add里面定义addInt方法

object add{
   def addInt( a:Int, b:Int ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}

2.函数
val funcName=([参数列表])=>{
funcBody
return [expr]
}

例子:

object multiplier{
        var factor = 3
        val multiplier = (i:Int,j:Int)=>{
	        i*j
	    }

        def main(arg:Array[String]){
                println(multiplier(5,6))
        }
}

二、scala之可变字符串与不可变字符串

object testString{
	val greeting:String = "Hello,World!" //不可变
	val buf = new StringBuilder   //可变
	buf += 'a'
	buf ++= "bcdef"

	def main(args:Array[String]){
		println(greeting)
		println("buf is" + buf.toString)
	}
}

三、数组的定义

一维数组:

var 数组名:Array[String] = new Array[String](数组长度)

或

var 数组名 = new Array[String](数组长度)

z(0) = "Runoob"; z(1) = "Baidu"; z(4/2) = "Google"

也可以下列方式定义

var z = Array("Runoob", "Baidu", "Google")

多维数组:

var myMatrix = ofDim[Int](行数,列数)  //定义一个3*3的空数组

四、列表List
参考:http://www.runoob.com/scala/scala-lists.html

List的特征是其元素以线性方式存储,集合中可以存放重复对象。

//一维列表
// 字符串列表
val site: List[String] = List("Runoob", "Google", "Baidu")

// 整型列表
val nums: List[Int] = List(1, 2, 3, 4)

// 空列表
val empty: List[Nothing] = List()


// 二维列表
val dim: List[List[Int]] =
   List(
      List(1, 0, 0),
      List(0, 1, 0),
      List(0, 0, 1)
   )
//构造列表的两个基本单位是 Nil 和 ::
//Nil 也可以表示为一个空列表。

// 字符串列表
val site = "Runoob" :: ("Google" :: ("Baidu" :: Nil))

// 整型列表
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))

// 空列表
val empty = Nil

// 二维列表
val dim = (1 :: (0 :: (0 :: Nil))) ::
          (0 :: (1 :: (0 :: Nil))) ::
          (0 :: (0 :: (1 :: Nil))) :: Nil

五、集合Set
http://www.runoob.com/scala/scala-sets.html

Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。

Scala 集合分为可变的和不可变的集合。
默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包;默认引用 scala.collection.immutable.Set,为不可变集合。

不可变集合:

val set = Set(1,2,3)
println(set.getClass.getName) // 

println(set.exists(_ % 2 == 0)) //true
println(set.drop(1)) //Set(2,3)

可变集合:

import scala.collection.mutable.Set // 可以在任何地方引入 可变集合

val mutableSet = Set(1,2,3)
println(mutableSet.getClass.getName) // scala.collection.mutable.HashSet

mutableSet.add(4)
mutableSet.remove(1)
mutableSet += 5
mutableSet -= 2

println(mutableSet) // Set(5, 3, 4)

val another = mutableSet.toSet
println(another.getClass.getName) // scala.collection.immutable.Set

六、映射Map
http://www.runoob.com/scala/scala-maps.html

Map(映射)是一种可迭代的键值对(key/value)结构,所有的值都可以通过键来获取。Map 中的键都是唯一的,Map 也叫哈希表(Hash tables)。

Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map类。

在 Scala中你可以同时使用可变与不可变 Map:不可变的直接使用 Map,可变的使用 mutable.Map。

//不可变map

// 空哈希表,键为字符串,值为整型
var A:Map[Char,Int] = Map()

// Map 键值对演示
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")

//定义 Map 时,需要为键值对定义类型。如果需要添加 key-value 对,可以使用 + 号,如下所示:

A += ('I' -> 1)
//三个常用方法
keys	 返回 Map 所有的键(key)
values	 返回 Map 所有的值(value)
isEmpty  在 Map 为空时返回true
//通过 foreach 循环输出 Map 中的 keys 和 values

object Test {
   def main(args: Array[String]) {
      val sites = Map("runoob" -> "http://www.runoob.com",
                       "baidu" -> "http://www.baidu.com",
                       "taobao" -> "http://www.taobao.com")

      sites.keys.foreach{ i =>  
                           print( "Key = " + i )
                           println(" Value = " + sites(i) )}
	  println(sites.contains("runood"))  //true;查看是否包含某个键值

   }
}

七、元组Tuple
http://www.runoob.com/scala/scala-tuples.html

与列表一样,元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的:

val t = (1, 3.14, "Fred")

val t1 = new Tuple3(1, 3.14, "Fred")
val t2 = new Tuple2(1,"Hello")

println(t._2)  //打印第二个元素,3.14

//迭代元组,使用Tuple.productIterator()方法来迭代输出元组的所有元素:

object Test {
   def main(args: Array[String]) {
      val t = (4,3,2,1)
      
      t.productIterator.foreach{ i =>
		      println("Value = " + i )}
   }
}

八、选项Option
http://www.runoob.com/scala/scala-options.html

Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。
Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象 None 。

val myMap: Map[String, String] = Map("key1" -> "value")
val value1: Option[String] = myMap.get("key1")
val value2: Option[String] = myMap.get("key2")
 
println(value1) // Some("value1")
println(value2) // None
object Test {
   def main(args: Array[String]) {
      val sites = Map("runoob" -> "www.runoob.com", "google" -> "www.google.com")
      
      println("sites.get( \"runoob\" ) : " +  sites.get( "runoob" )) // Some(www.runoob.com)
      println("sites.get( \"baidu\" ) : " +  sites.get( "baidu" ))  //  None
   }
}

九、Scala Iterator(迭代器)
http://www.runoob.com/scala/scala-iterators.html

Scala Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。

迭代器 it 的两个基本操作是 next 和 hasNext。
调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。
调用 it.hasNext() 用于检测集合中是否还有元素。

object Test {
   def main(args: Array[String]) {
      val it = Iterator("Baidu", "Google", "Runoob", "Taobao")
      
      while (it.hasNext){
         println(it.next())
      }
   }
}

十、类和对象
http://www.runoob.com/scala/scala-classes-objects.html

使用 new 关键字来创建类的对象,Scala中的类不声明为public,一个Scala源文件中可以有多个类;可以使用 new 来实例化类,并访问类中的方法和变量。

以下实例的类定义了两个变量 x 和 y ,一个方法:move,方法没有返回值;Scala 的类定义可以有参数,称为类参数,如下例的 xc, yc,类参数在整个类中都可以访问。

import java.io._

class Point(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x 的坐标点: " + x);
      println ("y 的坐标点: " + y);
   }
}

object Test {
   def main(args: Array[String]) {
      val pt = new Point(10, 20);

      // 移到一个新的位置
      pt.move(10, 10);
   }
}

执行以上代码,输出结果为:

$ scalac Test.scala 
$ scala Test
x 的坐标点: 20
y 的坐标点: 30

十一、Scala Trait(特征)

Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大;

与接口不同的是,它还可以定义属性和方法的实现;

一般情况下Scala的一个类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以被继承多个不同的接口,从结果来看就是实现了多重继承;

Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait。

十二、scala模式匹配

一个模式匹配包含了一系列备选项,每个都开始于关键字 case;

每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式;

match 对应 Java 里的 switch,但是写在选择器表达式之后。即: 选择器 match {备选项},match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配。

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))

   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}
执行以上代码,输出结果为:

$ scalac Test.scala 
$ scala Test
2
many
one
scala.Int

使用了case关键字的类定义就是就是样例类(case classes),样例类是种特殊的类,经过优化以用于模式匹配。

十三、Scala 正则表达式
http://www.runoob.com/scala/scala-regular-expressions.html

Scala 通过 scala.util.matching 包中的 Regex 类来支持正则表达式;

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")  // 首字母可以是大写 S 或小写 s
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))   // 使用逗号 , 连接返回结果
   }
}

十四、Scala 异常处理
Scala 的异常处理和其它语言比如 Java 类似。
Scala 的方法可以通过抛出异常的方法的方式来终止相关代码的运行,不必通过返回值。

Scala 抛出异常的方法和 Java一样,使用 throw 方法;

异常捕捉的机制与其他语言中一样,如果有异常发生,catch字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处,捕捉异常的catch子句,语法与其他语言中不太一样。在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case字句;

finally 语句用于执行不管是正常处理还是有异常发生时都需要执行的步骤。

import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException

object Test {
   def main(args: Array[String]) {
      try {
         val f = new FileReader("input.txt")
      } catch {
         case ex: FileNotFoundException => {
            println("Missing file exception")
         }
         case ex: IOException => {
            println("IO Exception")
         }
      } finally {
         println("Exiting finally...")
      }
   }
}

十五、Scala 提取器(Extractor)
http://www.runoob.com/scala/scala-extractors.html

提取器是从传递给它的对象中提取出构造该对象的参数。

Scala 标准库包含了一些预定义的提取器,我们会大致的了解一下它们。

Scala 提取器是一个带有unapply方法的对象;unapply方法算是apply方法的反向操作:unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。

十六、Scala 文件 I/O
http://www.runoob.com/scala/scala-file-io.html

Scala 进行文件写操作,直接用的都是 java中 的 I/O 类 (java.io.File)

//写入文件
import java.io._

object Test {
   def main(args: Array[String]) {
      val writer = new PrintWriter(new File("test.txt" )
      writer.write("菜鸟教程")
      writer.close()
   }
}
执行以上代码,会在你的当前目录下生产一个 test.txt 文件,文件内容为"菜鸟教程":

$ scalac Test.scala 
$ scala Test
$ cat test.txt 
菜鸟教程

从屏幕上读取用户输入

import scala.io._
object Test {
   def main(args: Array[String]) {
      print("请输入菜鸟教程官网 : " )
      
      val line = StdIn.readLine()   //读取屏幕输入

      println("谢谢,你输入的是: " + line)
   }
}

从文件上读取内容:使用 Scala 的 Source 类及伴生对象来读取文件

import scala.io.Source

object Test {
   def main(args: Array[String]) {
      println("文件内容为:" )

	  //从 "test.txt"(之前已创建过) 文件中读取内容
      Source.fromFile("test.txt" ).foreach{ 
         print 
      }

   }
}
执行以上代码,输出结果为:

$ scalac Test.scala 
$ scala Test
文件内容为:
菜鸟教程
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scala中,flatMap是一个用于集合操作的函数,它可以将嵌套的集合展平,并且可以应用于任何实现了FlatMap特质的集合类型。它的作用是将集合中的每个元素应用一个函数,这个函数返回一个子集合,然后将所有的子集合合并成一个新的集合。 举个例子,假设我们有一个包含字符串的列表listStr01,我们想要将每个字符串按空格切割,并将切割后的元素放入一个新的列表listStr02中。我们可以使用flatMap函数来实现这个操作: ``` val listStr01 = List("hello word", "hello hdfs", "hadoop hdfs") val listStr02 = listStr01.flatMap(_.split(" ")) listStr02.foreach(println) ``` 在上面的代码中,我们使用flatMap将listStr01中的每个字符串按空格切割成多个元素,并将这些元素放入listStr02中。最后,我们使用foreach函数打印出listStr02中的所有元素。 另外,flatMap还可以用于RDD(弹性分布式数据集)的操作。例如,在Spark中,我们可以使用flatMap操作来将一个RDD中的每个元素按照某种规则进行扁平化处理。下面是一个使用flatMap操作的例子: ``` val lineArray = Array("hello you","hello me","hello world") val lines = sc.parallelize(lineArray, 1) val words = lines.flatMap(line => line.split(" ")) words.foreach { word => println(word.mkString) } ``` 在上面的代码中,我们将lineArray转换为一个RDD对象lines,然后使用flatMap操作将每个元素按空格切割,并得到一个扁平化的RDD对象words。最后,我们使用foreach函数打印出words中的所有元素。 总结起来,flatMap函数在Scala中用于集合操作,可以将嵌套的集合展平。它可以应用于各种集合类型,并且可以按照某种规则将集合中的元素转换成新的集合。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值