scala
scala语言使用
永不落后于人
永远相信美好的事情即将发生
展开
-
Scala可变参数如何传递数组?
对于java中的可变参数来说,可以直接传递数组类型的数据。但是scala中不支持最直接传递数组类型的数据。可以通过数组名:_*的方式使用传递数组类型的数据。原创 2023-12-28 10:02:23 · 376 阅读 · 0 评论 -
Scala函数作为参数传递的理解
在上面的例子中,函数f1的参数列表是f: (Int, Int) => Int,表示参数是一个函数类型,该函数有两个Int类型的参数,返回值是一个Int类型的值。而我们定义的add函数,恰好满足该条件。f1(add _)表示将add函数当作整体传递到f1函数中,即将add函数当作参数传递。很明显,add函数在调用的时候必须传两个Int类型的参数,所以f1(add)可以推断出并不是要调用add函数,可以省略下划线。在上面的例子中,f2的返回值类型是f3的函数类型,即 () => int。原创 2022-09-04 22:00:14 · 1218 阅读 · 1 评论 -
scala中函数名 _(下划线)如何理解?
Scala中函数名 _表示的将函数整体赋值给一个变量,即用变量表示一个函数。如果变量明确类型,那么可以省略函数名后面的_需要注意的是,通过变量调用该函数时,需要在变量名后面加()。原创 2022-09-04 21:07:38 · 509 阅读 · 0 评论 -
Scala使用fast json将对象转为json字符串报错
Scala当使用fast json将对象转为json字符串:JSON.toJSONString(对象实例)报错如下:Error:(218, 34) ambiguous reference to overloaded definition,both method toJSONString in object JSON of type (x$1: Any, x$2: com.alibaba.fastjson.serializer.SerializerFeature*)Stringand metho原创 2021-05-25 09:25:11 · 606 阅读 · 0 评论 -
Scala隐式转换
说明 当编译器第一次编译失败的时候,会在当前作用域中寻找能让diamagnetic编译通过的方法,用于将类型进行转换,实现二次编译。 隐式转换可以在不修改任何代码的基础上,对类的功能进行扩展。 当调用对象的某个功能时,如果编原创 2021-03-15 10:56:40 · 64 阅读 · 0 评论 -
Scala异常基本语法
object Scala06_Exception { def main(args: Array[String]): Unit = { try{ var res = 10 / 0 } catch { // scala只有一个catch代码块,建议小的异常类型在上,大的在下 case e: ArithmeticException => println("除数不能为0" + e.getMessage) case e: Exception =原创 2021-03-10 22:00:34 · 99 阅读 · 0 评论 -
Scala模式匹配case的使用
基本语法val num1 = 10val num2 = 20val option = '&'// 模式匹配val res: Any = option match { case '+' => num1 + num2 case '-' => num1 - num2 case '*' => num1 * num2 case '/' => num1 / num2 case _ => "运算符不合法"}println(res)说明如果所原创 2021-03-10 21:35:37 · 871 阅读 · 0 评论 -
Scala版WordCount案例
需求单词计数,将集合中出现的相同的单词,进行计数,取计数排名前三的结果。Hello, Scala, Hbase, kafka, Hello, Scala, Hbase, Hello, Scala, Hello// List(Hello, Scala, Hbase, kafka, Hello, Scala, Hbase, Hello, Scala, Hello)val stringList = List("Hello Scala Hbase kafka", "Hello Scala Hbase",原创 2021-03-10 18:13:38 · 147 阅读 · 0 评论 -
Scala折叠(fold)
折叠集合外部元素和集合内部元素进行合并fold底层调用的是foldLeft,从左向右折叠。要求两个集合外的参数类型和集合内的参数类型必须一致。val list1: List[Int] = List(3, 5, 9, 10, 11)//println(list1.fold(10)(_ + _)) //48println(list1.fold(6)(_ - _)) //-32foldLeft从左向右折叠。集合外的参数类型和集合内的参数类型可以不一样。println(list原创 2021-03-09 22:02:48 · 1574 阅读 · 0 评论 -
Scala简化|归约reduce方法源码解析
作用将同一集合中的元素进行聚合。val list1: List[Int] = List(1, 2, 3, 4, 5, 6)println(list1.reduce(_ + _)) // 21// reduce底层调用的是reduceLeft,从左到右,两两元素进行聚合println(list1.reduce(_ - _)) // -19println(list1.reduceRight(_ - _)) // -3reduce和reduceLeftreduce底层调用的就是原创 2021-03-09 20:15:37 · 459 阅读 · 0 评论 -
Scala集合元素排序(sorted|sortBy|sortWith)
sorted普通排序,升序。val list1: List[Int] = List(12, 2, 45, -1, 6, 9, 10, -13)println(list1.sorted)sortBysortBy的参数为f:Int => B。即包含一个参数,参数和返回值类型可以不一致的函数。println(list1.sortBy(x => x.abs))// 如果函数的参数和函数体一样,那么不可省略println(list1.sortBy(x=>x))sortW原创 2021-03-09 16:38:22 · 699 阅读 · 0 评论 -
Scala 集合常用方法
获取集合的头val list1: List[Int] = List(1, 2, 3, 4)val list2: List[Int] = List(2, 3, 4, 5, 6)println(list1.head)获取集合的尾除了头之外的元素都是尾。println(list1.tail)集合最后一个数据println(list1.last)集合初始数据(不包含最后一个)println(list1.init)反转println(list1.reverse)取前(后)n个元原创 2021-03-09 16:22:14 · 142 阅读 · 0 评论 -
Scala 元组tuple的使用
说明元组最多有22个元素。创建元组val tuple1: (String, Int, String, String) = ("zhangsan", 21, "man", "beijing")访问元组中的元素println(tuple1._1)println(tuple1._2)println(tuple1._3)println(tuple1._4)通过索引访问println(tuple1.productElement(1))遍历元组for (elem <- tuple原创 2021-03-09 15:11:23 · 386 阅读 · 0 评论 -
Scala Map集合的使用
不可变Map创建Mapval map1: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)val map1: Map[String, Int] = Map(("a", 1), ("b", 2), ("c", 3))集合遍历map1.foreach((kv: (String, Int)) => println(kv))map1.foreach(println)获取所有keyval keys: Iterable[原创 2021-03-09 14:59:45 · 682 阅读 · 0 评论 -
Scala Set集合的基本使用
不可变Set创建Set集合val set1: Set[Int] = Set[Int](1, 2, 3, 4, 2)println(set1)添加元素val set2: Set[Int] = set1.+(5)println(set2)可变Set创建Set集合val set3: mutable.Set[Int] = mutable.Set(1, 2, 3, 4, 5)添加元素add方法会有一个布尔类型的返回值,代表元素是否添加成功。val flag: Boolean = se原创 2021-03-09 14:36:50 · 344 阅读 · 0 评论 -
Scala不可变集合和可变集合
说明Scala中集合的顶级父类是Seq,List也是Seq的一个子类。可变和不可变指的是集合的长度不可以发生变化。不可变集合当集合的长度发生变化时,会返回新的集合。不可变集合创建集合List是抽象的,只能通过apply方法创建对象。val list1: List[Int] = List(1, 2, 3, 4, 5)添加元素val list2: List[Int] = list1.:+(6)val list3: List[Int] = list1.::(10)Nil空集合当原创 2021-03-09 14:21:27 · 414 阅读 · 2 评论 -
Scala多维数组
创建二维数组val arr: Array[Array[Int]] = Array.ofDim[Int](2, 3)访问元素arr(1)(1) = 11遍历数组for (i <- 0 until arr.length; j <- 0 until arr(i).length) { println(arr(i)(j))}原创 2021-03-09 13:16:04 · 196 阅读 · 0 评论 -
Scala可变数组
创建数组// val arr: ArrayBuffer[Int] = new ArrayBuffer[Int]()val arr: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)访问元素println(arr(1))修改元素arr(1) = 20arr.update(1,11)println(arr(1))添加元素推荐不可变数组用符号操作元素,可变数组用方法操作元素。/*val newArr: ArrayBuffer[Int] =原创 2021-03-08 21:57:51 · 1241 阅读 · 0 评论 -
Scala不可变数组
说明不可变和可变指的是,当数组进行增删操作(长度发生变化)时,不可变数组会返回新的数组,原数组不会变化。可变数组会在原数组上进行修改。创建数组val arr: Array[Int] = new Array[Int](5)val arr2: Array[Int] = Array(1, 2, 3, 4, 5)修改数组指定位置的值arr(1) = 20数组遍历1.普通for循环for (i <- 0 to arr2.length - 1) { println(arr2(i))原创 2021-03-08 20:13:11 · 410 阅读 · 0 评论 -
特质和抽象类的对比和应用场景
相同点都可以包含抽象方法、抽象属性和非抽象方法、非抽象属性。都不能被实例化。但是都有默认的构造方法。不同点抽象类的构造方法可以传参,特质的构造方法不能传参。应用场景优先选择特质,scala是单继承,如果直接继承不方便后续的扩展。类是对大量对象的共性进行抽象,抽象类是对大量类的共性进行抽象。一般子类和父类要满足“子类is a父类”的规则。特质一般是对行为进行抽象,定义规范。...原创 2021-03-08 16:21:18 · 176 阅读 · 0 评论 -
Scala中特质的使用以及特质冲突
说明Scala语言中,采用特质trait来代替接口的概念。也就是说,多个类中,具有相同的特征时,可以将此特征独立出来,采用trait关键字声明。Scala特质中,既可以有抽象属性和抽象方法,也可以有非抽象属性和非抽象方法。一个类可以混入多个特质。混入单特质object Scala03_Trait { def main(args: Array[String]): Unit = { val stu:PersonTrait03 = new Student03 stu.sleep(原创 2021-03-08 15:39:05 · 321 阅读 · 1 评论 -
Scala单例模式
package com.aura.scala.day06/** * Author:panghu * Date:2021-03-08 * Description: 单例模式 * 1.私有化主构造器 * 2.私有化实例对象 * 3.提供静态的getInstance方法返回对象.scala中没有静态属性,利用伴生对象实现类似静态的属性 */object Scala02_Singleton { def原创 2021-03-08 14:16:44 · 114 阅读 · 0 评论 -
Scala通过apply方法创建对象
说明在Scala中,可以使用伴生对象的apply方法创建对象,而不使用new的方法创建对象。apply方法可以重载。带参的apply方法调用的是类中对应的有参构造器。当使用new创建对象时,调用的是类的构造器。当使用类名的方法创建对象时,调用的是伴生对象的apply方法。如果想要类的主构造器变成私有的,可以在主构造器的括号前加private(常用于单例模式)。代码object Scala01_CreateObject { def main(args: Array[String]): Un原创 2021-03-08 13:45:59 · 370 阅读 · 0 评论 -
Java中的多态和Scala中多态的对比
JavaJava多态属性是静态绑定的(编译器绑定),方法是动态绑定的(运行期绑定)。运行时,属性输出的是父类的值,方法运行的是子类的方法。即编译看左边,运行看右边。Java多态不能访问子类特有的属性和方法。ScalaScala多态属性和方法都是动态绑定的。运行时,属性和方法都是子类的。Java多态同样不能访问子类特有的属性和方法。Java代码public class Java02_Dynamic { public static void main(String[] args)原创 2021-03-08 10:49:25 · 131 阅读 · 1 评论 -
Scala抽象属性和抽象方法
Scala不仅有抽象方法的概念,还有抽象属性的概念。 抽象属性: 声明而没有赋初值的属性。 抽象方法: 声明了方法而没有方法体。  原创 2021-03-08 10:24:20 · 694 阅读 · 0 评论 -
Scala继承
继承父类的主构造器object Scala06_Extends { def main(args: Array[String]): Unit = { // 自动类型推导不能推断出多态,需要自己指定 val stu: Person06 = new Student06() // 1 3 val stu: Person06 = new Student06("1001") // 1 3 4 stu.name = "lisi" stu.age = 21 pr原创 2021-03-06 16:39:55 · 115 阅读 · 0 评论 -
Scala构造器(构造方法)的使用
构造器作用构造对象初始化属性构造器分类主构造器:声明类时,同时声明了类的主构造器。一个类只能有一个主构造器。辅助构造器: =>方法名必须叫this。 =&原创 2021-03-06 15:57:32 · 1284 阅读 · 0 评论 -
Scala权限修饰符的作用范围
public:scala中的默认权限,所有的类都可以访问。但是不可以显式声明。private:只有本类和伴生对象可以访问。protect:只有本类和子类可以访问,同包中其他类不可以访问。private[包名]:指定包下的其他类也可以访问。...原创 2021-03-06 14:48:31 · 189 阅读 · 0 评论 -
Scala导包的几种方式
顶部导入同Java,顶部导入类,整个文件中所有的类都可以使用。如:import java.util.ArrayList局部导入在使用的代码上方导入,只有同一范围的代码才可使用。如:import java.util.ArrayList通配符导入导入指定包下的所有类。如:import java.util._起别名为导入的类起别名如:import java.util.{ArrayList=>AL}屏蔽指定类导入包下其他类,屏蔽指定类如:import java.s原创 2021-03-06 11:44:52 · 1123 阅读 · 0 评论 -
Scala惰性函数(懒加载)
惰性函数当函数返回值被声明为lazy类型时,函数的执行将会被推迟,只有当首次取该函数的值时,函数才会执行。代码def sum(x: Int, y: Int): Int = { println("sum函数被执行了...") x + y}lazy val res: Int = sum(1,2)// println(res)注意lazy不能修饰var类型的变量。...原创 2021-03-06 11:15:50 · 163 阅读 · 0 评论 -
Scala柯里化+名调用+递归的使用
需求 模拟实现while循环。分析while的语法格式为:while(条件表达式) {循环体}Scala中大括号和小括号可以互相转化:while(条件表达式)(循环体)一个函数两个参数列表,就是柯里化的形式,循环体就要把代码块传递过来,循环就要使用递归。需要注意的是,条件表达式也要以代码块的形式传递过来。因为自定义的函数只会执行一次,如果传递的是表达式的值,后面递归过程中,条件表达式的值都是和初始一样的原创 2021-03-05 17:22:09 · 114 阅读 · 0 评论 -
Scala控制抽象(值调用和名调用)
值调用将函数的值作为参数传递。def f1(x: Int): Unit ={ println(x) println(x)}def f2(): Int = { 10}// 值调用f1(f2) // 10 10名调用将函数的代码块作为参数传递。格式:=> 返回值类型 def f3(x: => Int): Unit = { println(x) println(x)}def f4(): Int = { println("f4...原创 2021-03-05 16:31:27 · 165 阅读 · 0 评论 -
函数作为返回值(闭包和柯里化的使用)
一般写法 // 一般写法def fun1(): (String) => String = { // 内部函数 def f(s: String): String ={ s } // 函数作为返回值 f _}// 调用val ff: String => String = fun1()println(ff("hello"))// 或者println(fun1()("hi"))闭包概念 &nb原创 2021-03-05 15:33:42 · 150 阅读 · 2 评论 -
Scala函数作为参数传递
作用扩展函数的功能提高函数的灵活度需求 定义一个函数,传入数组类型的参数和一个函数,对数组中每个值分别进行运算后返回。代码// 函数类型的参数声明格式: 函数名: (参数类型) => 返回值类型def fun(arr: Array[Int], op: (Int) => Int): Array[Int] = { for (elem <- arr) yield o原创 2021-03-05 15:03:10 · 1376 阅读 · 0 评论 -
Scala函数作为值传递
含义 将函数整体赋值给一个变量。格式 val | var 变量名 = 函数名+空格+下划线代码变量类型就是函数的类型: 参数类型 => 返回值类型def f1(s: String): String ={ s}val ff: String => String = f1 _// 调用原创 2021-03-05 14:40:49 · 498 阅读 · 0 评论 -
Scala递归使用中的“坑”
需求 递归实现阶乘。分析递归先找到程序的出口,本需求中就是当n=1时返回1。如果不是程序的出口,那么就调用n*f(n-1)。代码实现(踩坑版)object Scala04_Recursion { def main(args: Array[String]): Unit = { def recursion(n: Int): Int ={ if (n == 1){原创 2021-03-05 12:02:35 · 107 阅读 · 0 评论 -
Scala函数至简原则
0.正常定义的函数def f0(s: String): String = { return s}1.return可以省略,Scala会使用函数体的最后一行代码作为返回值def f1(s: String): String = { s}2.如果函数体只有一行代码,可以省略花括号def f2(s: String): String = s3.返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)def f3(s: String) = s4.如果有return,则不能省略返原创 2021-03-04 18:03:30 · 460 阅读 · 1 评论 -
Scala函数参数的多种写法
可变参数格式 def 函数名(参数: 参数类型*): 返回值类型 = {}def f1(s:String*): Unit ={ println(s)}f1() // List()f1("abc","123") // WrappedArray(abc, 123)参数列表中存在多个参数,那么可变参数只能放置在最后def f2(age: Int, name: String*): Unit = {原创 2021-03-04 14:31:50 · 244 阅读 · 1 评论 -
Scala中函数和方法的区别
定义格式def 函数名|方法名(参数: 参数类型): 返回值类型 = { 函数体}区别函数声明在方法体中,方法声明在类中方法外。函数不支持重载、重写,方法支持重载和重写。原创 2021-03-04 13:22:26 · 288 阅读 · 1 评论 -
Scala中循环中断的实现方式
注意 Scala中没有Java中的break和continue关键字。Scala中所有的方法都是通过对象调用的。if判断实现Java中的continuefor (i <- 1 to 10 ; if i != 3) { println(i)}抛出异常实现Java中的breaktry { for (i <- 1 to 10) { if (i == 3) { thro原创 2021-03-04 11:54:48 · 705 阅读 · 2 评论