当前位置: 首页 > news >正文

240520Scala笔记

240520Scala笔记

第 7 章 集合

7.1 集合1 数组Array

集合(Test01_ImmutableArray):

package chapter07
​
object Test01_ImmutableArray {def main(args: Array[String]): Unit = {// 1. 创建数组val arr: Array[Int] = new Array[Int](5)// 另一种创建方式val arr2 = Array(12, 37, 42, 58, 97)println(arr)
​// 2. 访问元素println(arr(0))println(arr(1))println(arr(4))
//    println(arr(5))
​arr(0) = 12arr(4) = 57println(arr(0))println(arr(1))println(arr(4))
​println("========================")
​// 3. 数组的遍历// 1) 普通for循环for (i <- 0 until arr.length){println(arr(i))}
​for (i <- arr.indices) println(arr(i))
​println("---------------------")
​// 2) 直接遍历所有元素,增强for循环for (elem <- arr2) println(elem)
​println("---------------------")
​// 3) 迭代器val iter = arr2.iterator
​while (iter.hasNext)println(iter.next())
​println("---------------------")
​// 4) 调用foreach方法arr2.foreach( (elem: Int) => println(elem) )
​arr.foreach( println )
​println(arr2.mkString("--"))
​println("========================")// 4. 添加元素val newArr = arr2.:+(73)println(arr2.mkString("--"))println(newArr.mkString("--"))
​val newArr2 = newArr.+:(30)println(newArr2.mkString("--"))
​val newArr3 = newArr2 :+ 15val newArr4 = 19 +: 29 +: newArr3 :+ 26 :+ 73println(newArr4.mkString(", "))}
}
​

不可变数组用 +: 或 :+ 追加元素 可变数组用 arr1.append(6) 追加元素

7.2 集合2

package chapter07
​
import scala.collection.mutable
import scala.collection.mutable.ArrayBuffer
​
object Test02_ArrayBuffer {def main(args: Array[String]): Unit = {// 1. 创建可变数组val arr1: ArrayBuffer[Int] = new ArrayBuffer[Int]()val arr2 = ArrayBuffer(23, 57, 92)
​println(arr1)println(arr2)
​// 2. 访问元素
//    println(arr1(0))     // errorprintln(arr2(1))arr2(1) = 39println(arr2(1))
​println("======================")// 3. 添加元素val newArr1 = arr1 :+ 15println(arr1)println(newArr1)println(arr1 == newArr1)
​val newArr2 = arr1 += 19println(arr1)println(newArr2)println(arr1 == newArr2)newArr2 += 13println(arr1)
​77 +=: arr1println(arr1)println(newArr2)
​arr1.append(36)arr1.prepend(11, 76)arr1.insert(1, 13, 59)println(arr1)
​arr1.insertAll(2, newArr1)arr1.prependAll(newArr2)
​println(arr1)
​// 4. 删除元素arr1.remove(3)println(arr1)
​arr1.remove(0, 10)println(arr1)
​arr1 -= 13println(arr1)
​// 5. 可变数组转换为不可变数组val arr: ArrayBuffer[Int] = ArrayBuffer(23, 56, 98)val newArr: Array[Int] = arr.toArrayprintln(newArr.mkString(", "))println(arr)
​// 6. 不可变数组转换为可变数组val buffer: mutable.Buffer[Int] = newArr.toBufferprintln(buffer)println(newArr)}
}

arr.toArray 变成不可变数组 newArr.toBuffer 变成可变数组

7.3 集合3

package chapter07
​
object Test03_MulArray {def main(args: Array[String]): Unit = {// 1. 创建二维数组val array: Array[Array[Int]] = Array.ofDim[Int](2, 3)
​// 2. 访问元素array(0)(2) = 19array(1)(0) = 25
​println(array.mkString(", "))for (i <- 0 until array.length; j <- 0 until array(i).length){println(array(i)(j))}for (i <- array.indices; j <- array(i).indices){print(array(i)(j) + "\t")if (j == array(i).length - 1) println()}
​array.foreach(line => line.foreach(println))
​array.foreach(_.foreach(println))}
}
​

7.4 集合4 列表List

package chapter07
​
object Test04_List {def main(args: Array[String]): Unit = {// 1. 创建一个Listval list1 = List(23, 65, 87)println(list1)
​// 2. 访问和遍历元素println(list1(1))
//    list1(1) = 12list1.foreach(println)
​// 3. 添加元素val list2 = 10 +: list1val list3 = list1 :+ 23println(list1)println(list2)println(list3)
​println("==================")
​val list4 = list2.::(51)println(list4)
​val list5 = Nil.::(13)println(list5)
​val list6 = 73 :: 32 :: Nilval list7 = 17 :: 28 :: 59 :: 16 :: Nilprintln(list7)
​// 4. 合并列表val list8 = list6 :: list7println(list8)
​val list9 = list6 ::: list7println(list9)
​val list10 = list6 ++ list7println(list10)
​}
}
​

7.5 集合5

package chapter07
​
import scala.collection.mutable.ListBuffer
​
object Test05_ListBuffer {def main(args: Array[String]): Unit = {// 1. 创建可变列表val list1: ListBuffer[Int] = new ListBuffer[Int]()val list2 = ListBuffer(12, 53, 75)
​println(list1)println(list2)
​println("==============")
​// 2. 添加元素list1.append(15, 62)list2.prepend(20)
​list1.insert(1, 19, 22)
​println(list1)println(list2)
​println("==============")
​31 +=: 96 +=: list1 += 25 += 11println(list1)
​println("==============")// 3. 合并listval list3 = list1 ++ list2println(list1)println(list2)
​println("==============")
​list1 ++=: list2println(list1)println(list2)
​println("==============")
​// 4. 修改元素list2(3) = 30list2.update(0, 89)println(list2)
​// 5. 删除元素list2.remove(2)list2 -= 25println(list2)}
}
​

7.6 集合6 数集Set

package chapter07
​
object Test06_ImmutableSet {def main(args: Array[String]): Unit = {// 1. 创建setval set1 = Set(13, 23, 53, 12, 13, 23, 78)println(set1)
​println("==================")
​// 2. 添加元素val set2 = set1 + 129println(set1)println(set2)println("==================")
​// 3. 合并setval set3 = Set(19, 13, 23, 53, 67, 99)val set4 = set2 ++ set3println(set2)println(set3)println(set4)
​// 4. 删除元素val set5 = set3 - 13println(set3)println(set5)}
}
​

7.7 集合7

package chapter07
​
import scala.collection.mutable
​
object Test07_MutableSet {def main(args: Array[String]): Unit = {// 1. 创建setval set1: mutable.Set[Int] = mutable.Set(13, 23, 53, 12, 13, 23, 78)println(set1)
​println("==================")
​// 2. 添加元素val set2 = set1 + 11println(set1)println(set2)
​set1 += 11println(set1)
​val flag1 = set1.add(10)println(flag1)println(set1)val flag2 = set1.add(10)println(flag2)println(set1)
​println("==================")
​// 3. 删除元素set1 -= 11println(set1)
​val flag3 = set1.remove(10)println(flag3)println(set1)val flag4 = set1.remove(10)println(flag4)println(set1)
​println("==================")
​// 4. 合并两个Set
//    val set3 =
val set3 = Set(13, 12, 13, 27, 98)println(set1)println(set3)println("==================")set1 ++ set3val set4 = set1 ++ set3println(set1)println(set3)println(set4)println("==================")println(set1)println(set3)set1 ++= set3println(set1)}
}

7.8 集合8 映射(散列表)Map

package chapter07
​
object Test08_ImmutableMap {def main(args: Array[String]): Unit = {// 1. 创建mapval map1: Map[String, Int] = Map("a" -> 13, "b" -> 25, "hello" -> 3)println(map1)println(map1.getClass)
​println("==========================")// 2. 遍历元素map1.foreach(println)map1.foreach( (kv: (String, Int)) => println(kv) )
​println("============================")
​// 3. 取map中所有的key 或者 valuefor (key <- map1.keys){println(s"$key ---> ${map1.get(key)}")}
​// 4. 访问某一个key的valueprintln("a: " + map1.get("a").get)println("c: " + map1.get("c"))println("c: " + map1.getOrElse("c", 0))
​println(map1("a"))}
}
​

7.9 集合9

package chapter07import scala.collection.mutableobject Test09_MutableMap {def main(args: Array[String]): Unit = {// 1. 创建mapval map1: mutable.Map[String, Int] = mutable.Map("a" -> 13, "b" -> 25, "hello" -> 3)println(map1)println(map1.getClass)println("==========================")// 2. 添加元素map1.put("c", 5)map1.put("d", 9)println(map1)map1 += (("e", 7))println(map1)println("====================")// 3. 删除元素println(map1("c"))map1.remove("c")println(map1.getOrElse("c", 0))map1 -= "d"println(map1)println("====================")// 4. 修改元素map1.update("c", 5)map1.update("e", 10)println(map1)println("====================")// 5. 合并两个Mapval map2: Map[String, Int] = Map("aaa" -> 11, "b" -> 29, "hello" -> 5)
//    map1 ++= map2println(map1)println(map2)println("---------------------------")val map3: Map[String, Int] = map2 ++ map1println(map1)println(map2)println(map3)}
}

7.10 集合10 元祖tuple

package chapter07object Test10_Tuple {def main(args: Array[String]): Unit = {// 1. 创建元组val tuple: (String, Int, Char, Boolean) = ("hello", 100, 'a', true)println(tuple)// 2. 访问数据println(tuple._1)println(tuple._2)println(tuple._3)println(tuple._4)println(tuple.productElement(1))println("====================")// 3. 遍历元组数据for (elem <- tuple.productIterator)println(elem)// 4. 嵌套元组val mulTuple = (12, 0.3, "hello", (23, "scala"), 29)println(mulTuple._4._2)}
}

7.11 集合11 集合的常用函数

package chapter07object Test11_CommonOp {def main(args: Array[String]): Unit = {val list = List(1,3,5,7,2,89)val set = Set(23,34,423,75)//    (1)获取集合长度println(list.length)//    (2)获取集合大小println(set.size)//    (3)循环遍历for (elem <- list)println(elem)set.foreach(println)//    (4)迭代器for (elem <- list.iterator) println(elem)println("====================")//    (5)生成字符串println(list)println(set)println(list.mkString("--"))//    (6)是否包含println(list.contains(23))println(set.contains(23))}
}

这个比较实用一点 !!!

7.12 集合12 衍生集合

package chapter07object Test12_DerivedCollection {def main(args: Array[String]): Unit = {val list1 = List(1,3,5,7,2,89)val list2 = List(3,7,2,45,4,8,19)//    (1)获取集合的头println(list1.head)//    (2)获取集合的尾(不是头的就是尾)println(list1.tail)//    (3)集合最后一个数据println(list2.last)//    (4)集合初始数据(不包含最后一个)println(list2.init)//    (5)反转println(list1.reverse)//    (6)取前(后)n个元素println(list1.take(3))println(list1.takeRight(4))//    (7)去掉前(后)n个元素println(list1.drop(3))println(list1.dropRight(4))println("=========================")//    (8)并集val union = list1.union(list2)println("union: " + union)println(list1 ::: list2)// 如果是set做并集,会去重val set1 = Set(1,3,5,7,2,89)val set2 = Set(3,7,2,45,4,8,19)val union2 = set1.union(set2)println("union2: " + union2)println(set1 ++ set2)println("-----------------------")//    (9)交集val intersection = list1.intersect(list2)println("intersection: " + intersection)println("-----------------------")//    (10)差集val diff1 = list1.diff(list2)val diff2 = list2.diff(list1)println("diff1: " + diff1)println("diff2: " + diff2)println("-----------------------")//    (11)拉链println("zip: " + list1.zip(list2))println("zip: " + list2.zip(list1))println("-----------------------")//    (12)滑窗for (elem <- list1.sliding(3))println(elem)println("-----------------------")for (elem <- list2.sliding(4, 2))println(elem)println("-----------------------")for (elem <- list2.sliding(3, 3))println(elem)}
}

7.13 集合13 集合计算简单函数(sum求和...)

package chapter07object Test13_SimpleFunction {def main(args: Array[String]): Unit = {val list = List(5,1,8,2,-3,4)val list2 = List(("a", 5), ("b", 1), ("c", 8), ("d", 2), ("e", -3), ("f", 4))//    (1)求和var sum = 0for (elem <- list){sum += elem}println(sum)println(list.sum)//    (2)求乘积println(list.product)//    (3)最大值println(list.max)println(list2.maxBy( (tuple: (String, Int)) => tuple._2 ))println(list2.maxBy( _._2 ))//    (4)最小值println(list.min)println(list2.minBy(_._2))println("========================")//    (5)排序// 5.1 sortedval sortedList = list.sortedprintln(sortedList)// 从大到小逆序排序println(list.sorted.reverse)// 传入隐式参数println(list.sorted(Ordering[Int].reverse))println(list2.sorted)// 5.2 sortByprintln(list2.sortBy(_._2))println(list2.sortBy(_._2)(Ordering[Int].reverse))// 5.3 sortWithprintln(list.sortWith( (a: Int, b: Int) => {a < b} ))println(list.sortWith( _ < _ ))println(list.sortWith( _ > _))}
}

7.14 集合14 集合计算高级函数(过滤...)

package chapter07object Test14_HighLevelFunction_Map {def main(args: Array[String]): Unit = {val list = List(1,2,3,4,5,6,7,8,9)// 1. 过滤// 选取偶数val evenList = list.filter( (elem: Int) => {elem % 2 == 0} )println(evenList)// 选取奇数println(list.filter( _ % 2 == 1 ))println("=======================")// 2. 映射map// 把集合中每个数乘2println(list.map(_ * 2))println(list.map( x => x * x))println("=======================")// 3. 扁平化val nestedList: List[List[Int]] = List(List(1,2,3),List(4,5),List(6,7,8,9))val flatList = nestedList(0) ::: nestedList(1) ::: nestedList(2)println(flatList)val flatList2 = nestedList.flattenprintln(flatList2)println("=======================")// 4. 扁平映射// 将一组字符串进行分词,并保存成单词的列表val strings: List[String] = List("hello world", "hello scala", "hello java", "we study")val splitList: List[Array[String]] = strings.map( _.split(" ") )    // 分词val flattenList = splitList.flatten    // 打散扁平化println(flattenList)val flatmapList = strings.flatMap(_.split(" "))println(flatmapList)println("========================")// 5. 分组groupBy// 分成奇偶两组val groupMap: Map[Int, List[Int]] = list.groupBy( _ % 2)val groupMap2: Map[String, List[Int]] = list.groupBy( data => if (data % 2 == 0) "偶数" else "奇数")println(groupMap)println(groupMap2)// 给定一组词汇,按照单词的首字母进行分组val wordList = List("china", "america", "alice", "canada", "cary", "bob", "japan")println( wordList.groupBy( _.charAt(0) ) )}
}

7.15 集合15 redeuc归约,fold折叠

package chapter07object Test15_HighLevelFunction_Reduce {def main(args: Array[String]): Unit = {val list = List(1,2,3,4)// 1. reduceprintln(list.reduce( _ + _ ))println(list.reduceLeft(_ + _))println(list.reduceRight(_ + _))println("===========================")val list2 = List(3,4,5,8,10)println(list2.reduce(_ - _))    // -24println(list2.reduceLeft(_ - _))println(list2.reduceRight(_ - _))    // 3 - (4 - (5 - (8 - 10))), 6println("===========================")// 2. foldprintln(list.fold(10)(_ + _))     // 10 + 1 + 2 + 3 + 4println(list.foldLeft(10)(_ - _))    // 10 - 1 - 2 - 3 - 4println(list2.foldRight(11)(_ - _))    // 3 - (4 - (5 - (8 - (10 - 11)))),  -5}
}

7.16 集合16 合并列表(如果有相同的key就把value值相加)

package chapter07import scala.collection.mutableobject Test16_MergeMap {def main(args: Array[String]): Unit = {val map1 = Map("a" -> 1, "b" -> 3, "c" -> 6)val map2 = mutable.Map("a" -> 6, "b" -> 2, "c" -> 9, "d" -> 3)//    println(map1 ++ map2)val map3 = map1.foldLeft(map2)((mergedMap, kv) => {val key = kv._1val value = kv._2mergedMap(key) = mergedMap.getOrElse(key, 0) + valuemergedMap})println(map3)}
}

7.17 集合17

package chapter07object Test17_CommonWordCount {def main(args: Array[String]): Unit = {val stringList: List[String] = List("hello","hello world","hello scala","hello spark from scala","hello flink from scala")// 1. 对字符串进行切分,得到一个打散所有单词的列表
//    val wordList1: List[Array[String]] = stringList.map(_.split(" "))
//    val wordList2: List[String] = wordList1.flatten
//    println(wordList2)val wordList = stringList.flatMap(_.split(" "))println(wordList)// 2. 相同的单词进行分组val groupMap: Map[String, List[String]] = wordList.groupBy(word => word)println(groupMap)// 3. 对分组之后的list取长度,得到每个单词的个数val countMap: Map[String, Int] = groupMap.map(kv => (kv._1, kv._2.length))// 4. 将map转换为list,并排序取前3val sortList: List[(String, Int)] = countMap.toList.sortWith( _._2 > _._2 ).take(3)println(sortList)}
}

7.18 集合18

package chapter07object Test18_ComplexWordCount {def main(args: Array[String]): Unit = {val tupleList: List[(String, Int)] = List(("hello", 1),("hello world", 2),("hello scala", 3),("hello spark from scala", 1),("hello flink from scala", 2))// 思路一:直接展开为普通版本val newStringList: List[String] = tupleList.map(kv => {(kv._1.trim + " ") * kv._2})println(newStringList)// 接下来操作与普通版本完全一致val wordCountList: List[(String, Int)] = newStringList.flatMap(_.split(" "))    // 空格分词.groupBy( word => word )     // 按照单词分组.map( kv => (kv._1, kv._2.size) )     // 统计出每个单词的个数.toList.sortBy(_._2)(Ordering[Int].reverse).take(3)println(wordCountList)println("================================")// 思路二:直接基于预统计的结果进行转换// 1. 将字符串打散为单词,并结合对应的个数包装成二元组val preCountList: List[(String, Int)] = tupleList.flatMap(tuple => {val strings: Array[String] = tuple._1.split(" ")strings.map( word => (word, tuple._2) )})println(preCountList)// 2. 对二元组按照单词进行分组val preCountMap: Map[String, List[(String, Int)]] = preCountList.groupBy( _._1 )println(preCountMap)// 3. 叠加每个单词预统计的个数值val countMap: Map[String, Int] = preCountMap.mapValues(tupleList => tupleList.map(_._2).sum).toMapprintln(countMap)// 4. 转换成list,排序取前3val countList = countMap.toList.sortWith(_._2 > _._2).take(3)println(countList)}
}

7.19 集合19

package chapter07import scala.collection.immutable.Queue
import scala.collection.mutable
import scala.collection.parallel.immutableobject Test19_Queue {def main(args: Array[String]): Unit = {// 创建一个可变队列val queue: mutable.Queue[String] = new mutable.Queue[String]()queue.enqueue("a", "b", "c")println(queue)println(queue.dequeue())println(queue)println(queue.dequeue())println(queue)queue.enqueue("d", "e")println(queue)println(queue.dequeue())println(queue)println("==========================")// 不可变队列val queue2: Queue[String] = Queue("a", "b", "c")val queue3 = queue2.enqueue("d")println(queue2)println(queue3)}
}

7.20 集合20

package chapter07import scala.collection.immutable
import scala.collection.parallel.immutable.ParSeqobject Test20_Parallel {def main(args: Array[String]): Unit = {val result: immutable.IndexedSeq[Long] = (1 to 100).map(x => Thread.currentThread.getId)println(result)val result2: ParSeq[Long] = (1 to 100).par.map(x => Thread.currentThread.getId)println(result2)}
}

第 8 章 模式匹配

8.1 模式匹配1

package chapter08object Test01_PatternMatchBase {def main(args: Array[String]): Unit = {// 1. 基本定义语法val x: Int = 5val y: String = x match {case 1 => "one"case 2 => "two"case 3 => "three"case _ => "other"}println(y)// 2. 示例:用模式匹配实现简单二元运算val a = 25val b = 13def matchDualOp(op: Char): Int = op match {case '+' => a + bcase '-' => a - bcase '*' => a * bcase '/' => a / bcase '%' => a % bcase _ => -1}println(matchDualOp('+'))println(matchDualOp('/'))println(matchDualOp('\\'))println("=========================")// 3. 模式守卫// 求一个整数的绝对值def abs(num: Int): Int = {num match {case i if i >= 0 => icase i if i < 0 => -i}}println(abs(67))println(abs(0))println(abs(-24))}
}

8.2 模式匹配2

package chapter08object Test02_MatchTypes {def main(args: Array[String]): Unit = {// 1. 匹配常量def describeConst(x: Any): String = x match {case 1 => "Int one"case "hello" => "String hello"case true => "Boolean true"case '+' => "Char +"case _ => ""}println(describeConst("hello"))println(describeConst('+'))println(describeConst(0.3))println("==================================")// 2. 匹配类型def describeType(x: Any): String = x match {case i: Int => "Int " + icase s: String => "String " + scase list: List[String] => "List " + listcase array: Array[Int] => "Array[Int] " + array.mkString(",")case a => "Something else: " + a}println(describeType(35))println(describeType("hello"))println(describeType(List("hi", "hello")))println(describeType(List(2, 23)))println(describeType(Array("hi", "hello")))println(describeType(Array(2, 23)))// 3. 匹配数组for (arr <- List(Array(0),Array(1, 0),Array(0, 1, 0),Array(1, 1, 0),Array(2, 3, 7, 15),Array("hello", 1, 30),)) {val result = arr match {case Array(0) => "0"case Array(1, 0) => "Array(1, 0)"case Array(x, y) => "Array: " + x + ", " + y    // 匹配两元素数组case Array(0, _*) => "以0开头的数组"case Array(x, 1, z) => "中间为1的三元素数组"case _ => "something else"}println(result)}println("=========================")// 4. 匹配列表// 方式一for (list <- List(List(0),List(1, 0),List(0, 0, 0),List(1, 1, 0),List(88),List("hello"))) {val result = list match {case List(0) => "0"case List(x, y) => "List(x, y): " + x + ", " + ycase List(0, _*) => "List(0, ...)"case List(a) => "List(a): " + acase _ => "something else"}println(result)}// 方式二val list1 = List(1, 2, 5, 7, 24)val list = List(24)list match {case first :: second :: rest => println(s"first: $first, second: $second, rest: $rest")case _ => println("something else")}println("===========================")// 5. 匹配元组for (tuple <- List((0, 1),(0, 0),(0, 1, 0),(0, 1, 1),(1, 23, 56),("hello", true, 0.5))){val result = tuple match {case (a, b) => "" + a + ", " + bcase (0, _) => "(0, _)"case (a, 1, _) => "(a, 1, _) " + acase (x, y, z) => "(x, y, z) " + x + " " + y + " " + zcase _ => "something else"}println(result)}}
}

8.3 模式匹配3

package chapter08object Test03_MatchTupleExtend {def main(args: Array[String]): Unit = {// 1. 在变量声明时匹配val (x, y) = (10, "hello")println(s"x: $x, y: $y")val List(first, second, _*) = List(23, 15, 9, 78)println(s"first: $first, second: $second")val fir :: sec :: rest = List(23, 15 , 9, 78)println(s"first: $fir, second: $sec, rest: $rest")println("=====================")// 2. for推导式中进行模式匹配val list: List[(String, Int)] = List(("a", 12), ("b", 35), ("c", 27), ("a", 13))// 2.1 原本的遍历方式for (elem <- list){println(elem._1 + " " + elem._2)}// 2.2 将List的元素直接定义为元组,对变量赋值for ((word, count) <- list ){println(word + ": " + count)}println("-----------------------")// 2.3 可以不考虑某个位置的变量,只遍历key或者valuefor ((word, _) <- list)println(word)println("-----------------------")// 2.4 可以指定某个位置的值必须是多少for (("a", count) <- list){println(count)}}
}

8.4 模式匹配4

package chapter08object Test04_MatchObject {def main(args: Array[String]): Unit = {val student = new Student("alice", 19)// 针对对象实例的内容进行匹配val result = student match {case Student("alice", 18) => "Alice, 18"case _ => "Else"}println(result)}
}// 定义类
class Student(val name: String, val age: Int)// 定义伴生对象
object Student {def apply(name: String, age: Int): Student = new Student(name, age)// 必须实现一个unapply方法,用来对对象属性进行拆解def unapply(student: Student): Option[(String, Int)] = {if (student == null){None} else {Some((student.name, student.age))}}
}

8.5 模式匹配5

package chapter08object Test05_MatchCaseClass {def main(args: Array[String]): Unit = {val student = Student1("alice", 18)// 针对对象实例的内容进行匹配val result = student match {case Student1("alice", 18) => "Alice, 18"case _ => "Else"}println(result)}
}// 定义样例类
case class Student1(name: String, age: Int)

8.6 模式匹配6

package chapter08object Test06_PartialFunction {def main(args: Array[String]): Unit = {val list: List[(String, Int)] = List(("a", 12), ("b", 35), ("c", 27), ("a", 13))// 1. map转换,实现key不变,value2倍val newList = list.map( tuple => (tuple._1, tuple._2 * 2) )// 2. 用模式匹配对元组元素赋值,实现功能val newList2 = list.map(tuple => {tuple match {case (word, count) => (word, count * 2)}})// 3. 省略lambda表达式的写法,进行简化val newList3 = list.map {case (word, count) => (word, count * 2)}println(newList)println(newList2)println(newList3)// 偏函数的应用,求绝对值// 对输入数据分为不同的情形:正、负、0val positiveAbs: PartialFunction[Int, Int] = {case x if x > 0 => x}val negativeAbs: PartialFunction[Int, Int] = {case x if x < 0 => -x}val zeroAbs: PartialFunction[Int, Int] = {case 0 => 0}def abs(x: Int): Int = (positiveAbs orElse negativeAbs orElse zeroAbs) (x)println(abs(-67))println(abs(35))println(abs(0))}
}

第 9 章 异常与泛型

9.1 异常

package chapter09plusobject Test01_Exception {def main(args: Array[String]): Unit = {try{val n = 10 / 0} catch {case e: ArithmeticException => {println("发生算术异常")}case e: Exception => {println("发生一般异常")}} finally {println("处理结束")}}
}

9.2 泛型 1

package chapter09plusobject Test02_Implicit {def main(args: Array[String]): Unit = {val new12 = new MyRichInt(12)println(new12.myMax(15))// 1. 隐式函数implicit def convert(num: Int): MyRichInt = new MyRichInt(num)println(12.myMax(15))println("============================")// 2. 隐式类implicit class MyRichInt2(val self: Int) {// 自定义比较大小的方法def myMax2(n: Int): Int = if ( n < self ) self else ndef myMin2(n: Int): Int = if ( n < self ) n else self}println(12.myMin2(15))println("============================")// 3. 隐式参数implicit val str: String = "alice"
//    implicit val str2: String = "alice2"implicit val num: Int = 18def sayHello()(implicit name: String): Unit = {println("hello, " + name)}def sayHi(implicit name: String = "atguigu"): Unit = {println("hi, " + name)}sayHellosayHi// 简便写法def hiAge(): Unit = {println("hi, " + implicitly[Int])}hiAge()}
}// 自定义类
class MyRichInt(val self: Int) {// 自定义比较大小的方法def myMax(n: Int): Int = if ( n < self ) self else ndef myMin(n: Int): Int = if ( n < self ) n else self
}

9.3 泛型 2

package chapter09plusobject Test03_Generics {def main(args: Array[String]): Unit = {// 1. 协变和逆变val child: Parent = new Child
//    val childList: MyCollection[Parent] = new MyCollection[Child]val childList: MyCollection[SubChild] = new MyCollection[Child]// 2. 上下限def test[A <: Child](a: A): Unit = {println(a.getClass.getName)}test[SubChild](new SubChild)}
}// 定义继承关系
class Parent {}
class Child extends Parent {}
class SubChild extends Child {}// 定义带泛型的集合类型
class MyCollection[-E] {}

相关文章:

  • MySQL之查询性能优化(十)
  • 19.删除链表的倒数第N个结点
  • 如何利用exceljs将data数据导出表格实现日期去重,同时保留对应日期的每一列数据
  • 【C++ | 拷贝构造函数】一文了解C++的 拷贝(复制)构造函数
  • 【Linux】进程(8):Linux真正是如何调度的
  • Gradio.NET:一个快速制作演示demo网页的利器
  • 鸿蒙开发接口数据管理:【@ohos.data.preferences (首选项)】
  • 在Windows中使用svn的命令行
  • 【ARFoundation自学04】AR Tracked Image 图像追踪识别
  • 基于安卓的虫害识别软件设计--(1)模型训练与可视化
  • 关于安装typescript后运行tsc -v命令报错问题
  • idm2024最新完美破解版免费下载 idm绿色直装版注册机免费分享 idm永久激活码工具
  • HTML5 视频 Vedio 标签详解
  • 神经网络---网络模型的保存、加载
  • 分治算法例子
  • 【译】理解JavaScript:new 关键字
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • avalon2.2的VM生成过程
  • C语言笔记(第一章:C语言编程)
  • express如何解决request entity too large问题
  • Flex布局到底解决了什么问题
  • IDEA 插件开发入门教程
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript的使用你知道几种?(上)
  • JS基础之数据类型、对象、原型、原型链、继承
  • October CMS - 快速入门 9 Images And Galleries
  • SpiderData 2019年2月23日 DApp数据排行榜
  • SSH 免密登录
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 如何在GitHub上创建个人博客
  • 手写双向链表LinkedList的几个常用功能
  • 思维导图—你不知道的JavaScript中卷
  • 算法-插入排序
  • 一道闭包题引发的思考
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 第二十章:异步和文件I/O.(二十三)
  • ​520就是要宠粉,你的心头书我买单
  • ​业务双活的数据切换思路设计(下)
  • (4)(4.6) Triducer
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (rabbitmq的高级特性)消息可靠性
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (七)Java对象在Hibernate持久化层的状态
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .chm格式文件如何阅读
  • .NetCore部署微服务(二)
  • .NetCore项目nginx发布
  • ??eclipse的安装配置问题!??
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [AIGC] HashMap的扩容与缩容:动态调整容量以提高性能
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)