Scala
爱吃甜食_
一点点进步,让编程更有趣
展开
-
scala-18 泛型和泛型约束
泛型和上下界泛型泛型方法泛型类上下界 Bounds视图界定 View Bounds上下文界定Context Bounds多重界定泛型类、特质、方法都支持泛型。使用方括号来定义泛型的参数泛型方法不考虑泛型支持def getMiddle(arr:Array[Int]) = arr(arr.length / 2)def main(args: Array[String]): Unit = { val arr1 = Array(1,2,3,4,5) println(getMid原创 2020-07-19 11:20:51 · 154 阅读 · 0 评论 -
scala-20 隐式转换
隐式转换基本概念示例基本概念scala的隐式转换是一种强大的代码查找机制。scala中隐式转换无处不在,例如在scala中的类层次结构中Double Float等的相互转换在需要的时候。Int类型会在视图界定中,自定转换成RichInt,从而可以使用RichInt的compartable接口隐式转换的时机以下两种情况会发生编译器尝试进行隐式转换当方法中的参数类型与目标类型不一致时当对象调用类中不存在的方法或成员时隐式转换的前提:不存在二义性隐式操作不能嵌套使用(如 con原创 2020-07-18 21:48:10 · 127 阅读 · 0 评论 -
scala-19 协变、逆变、非变
协变、逆变、非变协变逆变非变示例总结由于擦拭法的原因,泛型中的的元素类型即使有继承关系,对应的泛型也没有相应的继承关系。示例class Pair[T](a:T)object Pair { def main(args: Array[String]): Unit = { val p1 = new Pair("hello") // 编译报错,无法将p1转换为p2 //hello->String //String->AnyRef String有个父类型原创 2020-07-18 18:18:37 · 185 阅读 · 0 评论 -
scala 异常处理
scala异常处理异常场景捕获异常抛出异常异常场景以下程序执行程序,可以看到scala抛出了异常,而且没有打印出来"你好"。说明程序出现错误后就终止了。def main(args: Array[String]): Unit = { val i = 10 / 0 println("你好!") }Exception in thread "main" java.lang.ArithmeticException: / by zero at ForDemo$.main(Fo原创 2020-07-17 23:29:08 · 379 阅读 · 0 评论 -
scala -17 提取器
提取器-Extractorscala 提取器是一个带有unapply方法的对象。unapply方法算是apply方法的反向操作unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值提取器常从传递给它的对象中提取出构造该对象的参数...原创 2020-07-17 23:26:05 · 145 阅读 · 0 评论 -
scala scala之Option
scala之Option在Scala中Option类型用样例类来表示可能存在或也可能不存在的值当数据集使用Option时,可以使用getOrElse代替Option类型有2个子类Some:包装了某值// 源码/** Class `Some[A]` represents existing values of type * `A`. * * @author Martin Odersky * @version 1.0, 16/07/2003 */@SerialVersio原创 2020-07-17 22:38:06 · 288 阅读 · 0 评论 -
scala-16模板匹配和偏函数
模板匹配和样例类模板匹配匹配字符串匹配类型匹配数组匹配集合匹配元组scala支持多种匹配模式模板匹配匹配字符串object CaseDemo01 extends App{ //定义一个数组 val arr=Array("hadoop","zookeeper","spark","storm") //随机取数组中的一位,使用Random.nextInt val name = arr(Random.nextInt(arr.length)) println(name) name原创 2020-07-17 19:26:21 · 251 阅读 · 0 评论 -
scala-15 trait
Traittrait作为接口使用trait中定义具体方法和具体字段模板模式trait可以混入到实例对象中scala中的trait类似java中的interface。trait是scala中代码复用的基本单元。它可以将方法和类封装起来,然后添加到类中scala中每个类只能继承一个超类,但可以添加任意数量的traittriat的定义和抽象类的定义很像,但是它使用trait关键字trait作为接口使用可以通过trait来扩展子类功能和继承类一样,同样使用关键字extends来继承trait继原创 2020-07-17 17:14:42 · 117 阅读 · 0 评论 -
scala 类型的判断和转换(isInstanceOf asinstanceof getClass classOf)
scala类型的判断和转换isInstanceOf 和asinstanceOfgetClass和classOfgetClass和classOf的区别isInstanceOf 和asinstanceOfisInstanceOf用来判断对象是否为指定类或其子类的对象asinstanceOf将对象转换为知道类型java和scala写法对比JavaScala判断对象是否是C类型obj instanceof Cobj.isInstanceof[C]将对象强转成C类型(C原创 2020-07-17 15:59:31 · 444 阅读 · 0 评论 -
scala-14 继承
scala继承调用父类的constructoroverride和super访问修饰符private修饰符protected修饰符scala同样适用extends关键字来实现继承。scala只支持类的单继承,但是可以继承多个traitscala类的层次结构的根是Any,没有父类可以在子类中定义父类中没有的字段和方法可以在子类中重写父类的方法重写非抽象类方法必须使用override关键字重写抽象类方法override可以写或者省略示例1class Person { var name原创 2020-07-17 15:04:51 · 264 阅读 · 0 评论 -
scala中s和${}
S和${}s${}s字符串中的变量替换,Scala中基础的字符串插值就是在字符串前加字幕‘s’,然后在字符串中放入变量,每个变量都应以‘$’开头。字符串前加字母‘s’时,其实是在创建一个处理字符串字面量示例package demoobject Demo12 { def main(args:Array[String])={ var name = "zhangsan" var age = 15 println(s"name=$name,age=$age") }}转载 2020-07-17 10:32:21 · 3165 阅读 · 0 评论 -
scala-13 对象
scala对象Object伴生对象apply方法scala中的main方法Objectscala中没有静态成员。如果想使用static变量、static方法,可以使用scala中的单例对象object在object中定义变量和方法,再通过object去调用,可以达到java中的静态的效果java中的Object是所有类的超类,而scala中的object相当于java中的单例对象object的定义定义单例对象和定义类很像,只需要将class换为object即可示例object sc原创 2020-07-17 10:29:25 · 100 阅读 · 0 评论 -
scala-12 类
scala-类构造器类内变量的赋值scala除了支持面向函数,同事支持面向对象。构造器scala的构造器分两种主构造器辅助构造器主构造器:主构造器是只在类名后面跟上一系列的参数class 类名(var/val 参数名:类型 = 默认值, var/val 参数名:类型 = 默认值){ // 构造代码块}辅助构造器:在类中使用this来定义辅助构造器的第一行必须调用主构造器、其他辅助构造器、或者super父类的构造器def this(参数名:类型, 参数名:类型) {原创 2020-07-16 18:33:50 · 124 阅读 · 0 评论 -
scala-11匿名函数、柯里化、闭包
匿名函数、柯里化、闭包匿名函数函数值做参数柯里化闭包匿名函数定义一个没有名称的函数,该函数就是匿名函数示例//定义一个数组scala> val array=Array(1,2,3,4,5)array: Array[Int] = Array(1, 2, 3, 4, 5)//定义一个没有名称的函数----匿名函数scala> array.map(x=>x*10)res1: Array[Int] = Array(10, 20, 30, 40, 50)函数值做参数//定义原创 2020-07-16 17:46:38 · 220 阅读 · 1 评论 -
scala reduce和Fold
reduce和fold区别reducereduce源码reduceLeft源码示例reduceRight源码reduceLeftOption源码reduceRightOption源码总结var acc: B = 0.asInstanceOf[B]foldfold源码解析fold和foldLeft(存疑)reduce和fold区别reducereduce表示将列表,传入一个函数进行聚合运算。reduce源码[A1 >: A]:reduce的参数A1必须为调用reduce数据集元素类型的子集r原创 2020-07-15 18:13:21 · 460 阅读 · 0 评论 -
scala-10函数式编程之常用函数
scala函数值编程之常用函数面向函数式编程遍历 - foreach映射 - map扁平化映射 - flatmap过滤 - filter排序 - sort默认排序-sorted按照指定关键字排序 sortBysortWith分组 - groupBy聚合 - reduce折叠 - foldReduce和Fold区别面向函数式编程面向函数式编程是一种编程范式。可以简单的把面向函数式编程理解为:把函数作为参数传递到方法中,该函数会作用在集合中元素上,最后函数体来控制最终的业务逻辑。遍历 - forea原创 2020-07-11 21:34:43 · 279 阅读 · 0 评论 -
scala-9 列表List
列表List列表List不可变List可变List列表基础操作列表List从某种角度看scala中List的性质正好与Set相反List具备以下性质:可以保存重复的值有先后顺序列表可以看做是两个部分组成:头部和非头部。头部即第一个元素list.head,非头部即剩余的元素的集合list.tail在scala中,也有两种列表,不可变列表可变列表可变List和不可变List的创建语法不同不可变List不可变列表就是列表的元素、长度都是不可变的语法val原创 2020-07-10 00:40:29 · 157 阅读 · 0 评论 -
scala-8 Set集合
scala之Set集合Set集合不可变Set可变SetSet集合Set集合用来存储没有重复元素的集合Set具有以下特点:元素不重复不保证插入顺序(即插入的顺序与集合中元素的顺序不一定一直)scala有两种Set:不可变Set可变Set语法//创建一个空的Setval/var 变量名 = Set[类型]()//给定元素来创建一个Setval/var 变量名 = Set[类型](元素1, 元素2, 元素3...)不可变Set对不可变的set集合进行添加删除等操作,对于该原创 2020-07-10 00:09:03 · 246 阅读 · 0 评论 -
scala-7 映射Map
scala映射map映射Map不可变Map可变MapMap基本操作映射MapMap是有键值对组成的集合。scala中的map与java中的map相似。scala中的map可以分为两类:可变map不可变map两种map的定义语法一致:语法val/var map = Map(key->value,key->value....) //推荐,可读性更好val/var map = Map((key,value),(key,value)...)不可变Map不可变map指的是:原创 2020-07-09 23:29:17 · 240 阅读 · 0 评论 -
scala-6 元组
scala元组scala元组访问元组scala元组元组用来存储一组不同类型的值元组中元素的类型和元组的值可以不同元组中的元素一旦存储,其值不可以改变。即元组中元素的类型都是val元组中的第一个元素角标为1语法// 使用括号来定义元组val/var 元组变量名称 = (元素1, 元素2, 元素3....)// 使用箭头来定义元素 元组中每两个元素会组成一个元组val/var 元组 = 元素1->元素2示例scala> val a =(1,"zhangsan",2,"l原创 2020-07-09 21:23:39 · 231 阅读 · 0 评论 -
scala-5数组
scala数组scala数组定长数组变长数组变长数组的增删改遍历数组数组的常用方法scala数组scala数组和java类似,用来存放一组类型相同的数据。scala中,数组的泛型使用[]来指定,通过()来获取元素。此处与Java略微不同scala中有两种数组:定长数组变长数组定长数组定长数组是指数组的长度不允许改变。数组的元素可以改变语法// 通过指定长度定义数组val/var 变量名 = new Array[元素类型](数组长度)// 用元素直接初始化数组(主要使用这种方式·原创 2020-07-09 20:51:47 · 350 阅读 · 0 评论 -
scala-4 方法和函数
scala方法和函数方法方法的参数默认参数带名参数变长参数函数方法和函数的区别方法转函数方法语法def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = { // 方法体:一系列的代码}参数表的参数类型不能省略返回值类型一般情况下可以省略,由scala编译器自动推断返回值类型,在递归的情况下必须写,不可以省略返回值可以不写return,返回值默认就是{}块表达式的值,即块表达式最后一行的值示例1:常规定义//{}中只有一条原创 2020-07-09 17:00:01 · 176 阅读 · 0 评论 -
scala-3 循环
scala循环scala循环for循环for循环之守卫for推导式while循环scala循环scala支持for循环和while循环。推荐使用更简洁的for循环for循环语法//每次循环将表达式/数组/集合的值赋给i//不用声明i的类型,scala可以自动推断for(i <- 表达式/数组/集合){ //表达式}//双重循环用分号隔开 两个循环条件即可for(i <- 表达式/数组/集合;j <- 表达式/数组/集合){ //表达式}示例//1 t原创 2020-07-09 15:31:32 · 250 阅读 · 0 评论 -
scala-2 scala变量和数据类型
scala变量scala变量scala变量类型定义变量语法惰性变量scala中的数据类型scala类型的层次结构scala变量scala变量类型val定义不可重新赋值的变量(变量值不可以修改)var定义可以重新赋值的变量(变量值可以修改)定义变量语法var/val 变量名称:变量类型 = 初始值scala中声明变量,变量名称在前,变量类型在后。与java相反scala语句末尾不需要添加分号scala支持类型推断,变量类型可以不写示例://使用val声明变量,相当于java中的原创 2020-07-09 14:51:07 · 204 阅读 · 0 评论 -
scala-1 scala基本概念
scala基本概念scala简介scala和java编译执行流程简单对比两种scala环境在IDEA中安装scala插件(略)REPL交互解释器REPL交互解释器配置scala简介scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程scala的主要优势在于它的表达性、相对于java可以用更少量的代码来实现相同的功能。另外,spark的源码也是采用scala语言编写的scala兼容java,可以访问java类库多范式可式编程语言,可以简单的理解为:语言支持多种编程风格思想原创 2020-07-09 14:29:40 · 218 阅读 · 0 评论 -
Scala遍历Map的三种方式
一每次遍历先获取key二每次获取其中一个元祖三每次循环直接解析元祖(析构)原创 2020-02-26 12:14:56 · 9712 阅读 · 1 评论