odoo与wordpress/seo成都培训
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] {}
相关文章:

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(…...

【React】封装一个好用方便的消息框(Hooks Bootstrap 实践)
引言 以 Bootstrap 为例,使用模态框编写一个简单的消息框: import { useState } from "react"; import { Modal } from "react-bootstrap"; import Button from "react-bootstrap/Button"; import bootstrap/dist/css/b…...

tomcat10部署踩坑记录-公网IP和服务器系统IP搞混
1. 服务器基本条件 使用的阿里云服务器,镜像系统是Ubuntu16.04java version “17.0.11” 2024-04-16 LTS装的是tomcat10.1.24阿里云服务器安全组放行了:8080端口 服务器防火墙关闭: 监听情况和下图一样: tomcat正常启动ÿ…...

探索Sass:Web开发的强大工具
在现代Web开发中,CSS(层叠样式表)作为前端样式设计的核心技术,已经发展得非常成熟。然而,随着Web应用的复杂性不断增加,传统的CSS书写方式逐渐暴露出一些不足之处,如代码冗长、难以维护、缺乏编程功能等。为了解决这些问题,Sass(Syntactically Awesome Stylesheets)应…...

vue组件之间的通信方式有哪些
在开发过程中,数据传输是一个核心的知识点,掌握了数据传输,相当于掌握了80%的内容。 Vue.js 提供了多种组件间的通信方式,这些方式适应不同的场景和需求。下面是4种常见的通信方式: 1. Props & Events (父子组件通…...

111、二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 题解:找出最小深度也就是找出根节点相对所有叶子结点的最小高度,在这也表明了根节点的高度是变化的,相对不同的叶子结点有不同的高度。…...

SpringBoot3依赖管理,自动配置
文章目录 1. 项目新建2. 相关pom依赖3. 依赖管理机制导入 starter 所有相关依赖都会导入进来为什么版本号都不用写?如何自定义版本号第三方的jar包 4. 自动配置机制5. 核心注解 1. 项目新建 直接建Maven项目通过官方提供的Spring Initializr项目创建 2. 相关pom依…...

音视频开发17 FFmpeg 音频解码- 将 aac 解码成 pcm
这一节,接 音视频开发12 FFmpeg 解复用详情分析,前面我们已经对一个 MP4文件,或者 FLV文件,或者TS文件进行了 解复用,解出来的 视频是H264,音频是AAC,那么接下来就要对H264和AAC进行处理,这一节…...

vue2中封装图片上传获取方法类(针对后端返回的数据不是图片链接,只是图片编号)
在Vue 2中实现商品列表中带有图片编号,并将返回的图片插入到商品列表中,可以通过以下步骤完成: 在Vue组件的data函数中定义商品列表和图片URL数组。 创建一个方法来获取每个商品的图片URL。 使用v-for指令在模板中遍历商品列表,并…...

【C++面向对象编程】(二)this指针和静态成员
文章目录 this指针和静态成员this指针静态成员 this指针和静态成员 this指针 C中类的成员变量和成员函数的存储方式有所不同: 成员变量:对象的成员变量直接作为对象的一部分存储在内存中。成员函数:成员函数(非静态成员函数&am…...

最大矩形问题
柱状图中最大的矩形 题目 分析 矩形的面积等于宽乘以高,因此只要能确定每个矩形的宽和高,就能计算它的面积。如果直方图中一个矩形从下标为 i 的柱子开始,到下标为 j 的柱子结束,那么这两根柱子之间的矩形(含两端的柱…...

LeetCode62不同路径
题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径? …...

GNU Radio实现OFDM Radar
文章目录 前言一、GNU Radio Radar Toolbox编译及安装二、ofdm radar 原理讲解三、GNU Radio 实现 OFDM Radar1、官方提供的 grc①、grc 图②、运行结果 2、修改后的便于后续可实现探测和通信的 grc①、grc 图②、运行结果 四、资源自取 前言 本文使用 GNU Radio 搭建 OFDM Ra…...

东方博宜1760 - 整理抽屉
题目描述 期末考试即将来临,小T由于同时肩负了学习、竞赛、班团活动等多方面的任务,一直没有时间好好整理他的课桌抽屉,为了更好地复习,小T首先要把课桌抽屉里的书分类整理好。 小T的抽屉里堆着 N 本书,每本书的封面上…...

react快速开始(四)-之Vite 还是 (Create React App) CRA? 用Vite创建项目
文章目录 react快速开始(四)-之Vite 还是 (Create React App) CRA? 用Vite创建项目背景Vite 和 (Create React App) CRAVite?Vite 是否支持 TypeScript? 用Vite创建react项目参考 react快速开始(四)-之Vite 还是 (Create React App) CRA? 用Vite创建项…...

使用python绘制核密度估计图
使用python绘制核密度估计图 核密度估计图介绍效果代码 核密度估计图介绍 核密度估计(Kernel Density Estimation,KDE)是一种用于估计数据概率密度函数的非参数方法。与直方图不同,KDE 可以生成平滑的密度曲线,更好地…...

5. MySQL 运算符和函数
文章目录 【 1. 算术运算符 】【 2. 逻辑运算符 】2.1 逻辑非 (NOT 或者 !)2.2 逻辑与运算符 (AND 或者 &&)2.3 逻辑或 (OR 或者 ||)2.4 异或运算 (XOR) 【 3. 比较运算符 】3.1 等于 3.2 安全等于运算符 <>3.3 不等于运算符 (<> 或者 !)3.4 小于等于运算符…...

Linux学习之vi文本编辑器的使用
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

【数据结构】链表与顺序表的比较
不同点: 顺序表和链表是两种常见的数据结构,他们的不同点在于存储方式和插入、删除操作、随机访问、cpu缓存利用率等方面。 一、存储方式不同: 顺序表: 顺序表的存储方式是顺序存储,在内存中申请一块连续的空间,通…...

dart 基本语法
//入口方法 main() 或 void main() //数据类型 原生数据类型 String int double bool null 注意:String 包函 ‘’ “” ‘’’ ‘’’ 三种形式复杂数据类型 list Set Map自定义数据类型 class inheritance动态数据类型 var 注:dart 是静态类型语言&a…...

【经验分享】嵌入式入坑经历(选段)
文章目录 你现在的工作中所用到的专业知识有哪些呢?为什么想转行了?后来为什么从事了嵌入式行业呢?你对嵌入式的兴趣是何时培养起来的?你是怎么平衡兴趣爱好和工作的关系的?平时做的事情对你现在的工作有哪些帮助?对于有志学习嵌入式开发的在校大学生…...

Docker面试整理-Docker与虚拟机的区别是什么?
Docker 容器和传统的虚拟机(VM)都是提供隔离的运行环境以部署和运行应用程序的技术,但它们在架构和性能上存在显著的不同。了解这些差异可以帮助你选择最适合特定需求的解决方案: 基础架构:虚拟机:每个虚拟机都包括完整的操作系统、应用程序、必需的库和二进制文件,运行在…...

Java:JDK8 GC中ParNew和CMS的问题说明
JDK8中常用如下的垃圾收集器,它们分别运用在年轻代和老年代: ParNew : 年轻代垃圾收集器,多线程,采用标记—复制算法。 CMS:老年代的收集器,全称(Concurrent Mark and Sweep)&#…...

学单片机前先学什么?
先学c语言和数字电路 这里默认你说的单片机是51单片机,通过你的问题,我猜你的单片机应该还没有入门,如果是入门的话,一般都是从51单片机开始的。刚好我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从…...

数据可视化:Matplotlib 与 Seaborn
数据可视化是数据分析中至关重要的一部分,它能帮助我们直观地理解数据的分布、趋势和关系。Python 中,Matplotlib 和 Seaborn 是两个最常用的可视化库。本文将详细介绍如何使用 Matplotlib 和 Seaborn 进行数据可视化,包括基本图形、图形定制…...

【linux】自定义快捷命令/脚本
linux自定义快捷命令 场景自定义命令自定义脚本 场景 深度学习经常要切换到自己环境,conda activate mmagic,但是又不想每次重复打这么多字,想使用快捷命令直接切换。 自定义命令 使用别名(alias)或自定义脚本来创建…...

使用onnxruntime加载YOLOv8生成的onnx文件进行目标检测
在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 LabelMe 工具进行标注,然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容…...

QT 信号和槽 一对多关联示例,一个信号,多个槽函数响应,一个信号源如何绑定多个槽函数
在窗体里放置一个单行文本编辑控件(QLineEdit)、一个标签控件(QLabel)和一个文本浏览控件(QTextBrowser),在单行文 本编辑控件里的文本被编辑时,标签控件和文本浏览控件都会同步显示…...

C++ AVL树 详细讲解
目录 一、AVL树的概念 二、AVL树的实现 1.AVL树节点的定义 2.AVL树的插入 3.AVL树的旋转 4.AVL树的验证 三、AVL树的性能 四、完结撒❀ 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但 如果数据有序或接近有序二叉搜索树将退化为单支树,查 …...

Faster R-CNN:端到端的目标检测网络
本文回顾了由微软研究人员开发的 Faster R-CNN 模型。Faster R-CNN 是一种用于物体检测的深度卷积网络,在用户看来,它是一个单一的、端到端的统一网络。该网络可以准确快速地预测不同物体的位置。为了真正理解 Faster R-CNN,我们还必须快速概…...