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] {}相关文章:
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…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
