Scala
Scala 基础
静谧之心
专业摩的佬
业余吉他手
退役喷子
展开
-
Scala之 协变、逆变和不变
基本介绍Scala的协变(+),逆变(-),协变covariant、逆变contravariant、不可变invariant对于一个带类型参数的类型,比如 List[T],如果对 A 及其子类型 B,满足 List[B]也符合 List[A] 的子类型,那么就称为 covariance(协变) ,如果 List[A]是 List[B]的子类型,即与原来的父子关系正相 反,则称为 contra...原创 2019-12-23 06:12:07 · 502 阅读 · 1 评论 -
Scala之 泛型、上下界、视图界定 、上下文界定
泛型的基本介绍如果我们要求函数的参数可以接受任意类型。可以使用泛型,这个类型可以代表任意的数据类 型。例如 List,在创建 List 时,可以传入整型、字符串、浮点数等等任意类型。那是因为 List 在 类定义时引用了泛型。比如在 Java 中:public interface List<E> extends Collection<E>上界(Upper Bou...原创 2019-12-23 06:03:35 · 842 阅读 · 1 评论 -
Scala 之一行搞定WordCount
object Test extends App { val lines = List("hello csdn hello ksl hello asd asd dsudrf" , "i jirgjiji fnjadf" , "igbwi b u ue nnn ggnnugnrn" ,"nn wnui g ngndu abd abd jij ji ji jj iji ...原创 2019-12-13 06:02:24 · 3460 阅读 · 1 评论 -
Scala 利用Akka模拟Sparkmaster Worker心跳机制
项目的意义深入理解 Spark 的 Master 和 Worker 的通讯机制为了方便同学们看 Spark 的底层源码,命名的方式和源码保持一致.(如: 通讯消息类命名就是 一样的)加深对主从服务心跳检测机制(HeartBeat)的理解,方便以后 spark 源码二次开发。项目的需求worker注册到Master,Master完成注册,并回复worker注册成功worker定时发...原创 2019-12-10 05:38:34 · 500 阅读 · 1 评论 -
Scala 之并发编程模型 Akka
Akka 介绍Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时,你可以理解成 Akka 是编写并发程序的框架。Akka用Scala语言写成,同时提供了Scala和Java的开发接口。Akka主要解决的问题是:可以轻松的写出高效稳定的并发程序,程序员不再过多的考虑线程、锁和资源竞争等细节。Actor 模型用于解决什么问题处理并发问题关键是要保证共享数据...原创 2019-12-08 12:14:02 · 417 阅读 · 0 评论 -
Scala 之控制抽象
控制抽象控制抽象是函数,并且满足如下条件参数是函数函数参数没有输入值也没有返回值实战: 使用控制抽象实现 while 语法:object AbstractControl { def main(args: Array[String]): Unit = { //myRunInThread 就是一个抽象控制 // f1 是没有输入, 也没有输出的函数 f1: () =&...原创 2019-12-03 07:11:14 · 546 阅读 · 0 评论 -
Scala 之函数柯里化
函数柯里化函数编程中,接受多个参数的函数都可以转化为接受单个参数的函数,这个转化过程就叫柯里化柯里化就是证明了函数只需要一个参数而已。其实我们刚才的学习过程中,已经涉及到了柯里化操作。不用设立柯里化存在的意义这样的命题。柯里化就是以函数为主体这种思想发展的必然产生的结果。(即:柯里化是面向函数思想的必然产生结果)使用常规的方式完成def mul(x: Int, y: Int) = x...原创 2019-12-03 06:20:40 · 1560 阅读 · 0 评论 -
Scala 之闭包
什么是闭包?(y:Int)=>x – y 返回的是一个匿名函数 ,因为该函数引用到到函数外的 x,那么 该函数和 x 整体形成一个闭包 如:这里 val f = minusxy(20) 的 f 函数就是闭包你可以这样理解,返回函数是一个对象,而 x 就是该对象的一个字段,他们共同形成一个闭包当多次调用 f 时(可以理解多次调用闭包),发现使用的是同一个 x, 所以 x 不变。在使用...原创 2019-12-02 14:18:59 · 398 阅读 · 0 评论 -
Scala 之高阶函数
高阶函数能够接受函数作为参数的函数,叫做高阶函数 (higher-order function)。可使应用程序更加健壮。object HigherOrderFunction { def main(args: Array[String]): Unit = { def test(f: Double => Double, f2: Double => Int, n1: Doub...原创 2019-12-02 13:13:20 · 361 阅读 · 0 评论 -
Scala 之参数(类型)推断
参数(类型)推断参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以进行相应的简写。应用案例参数类型是可以推断时,可以省略参数类型当传入的函数,只有单个参数时,可以省去括号如果变量只在=>右边只出现一次,可以用_来代替//分别说明val list =...原创 2019-12-02 12:56:54 · 690 阅读 · 0 评论 -
Scala 之偏函数
偏函数使用构建特质的实现类(使用的方式是 PartialFunction 的匿名子类)PartialFunction 是个特质(看源码)构建偏函数时,参数形式 [Any, Int]是泛型,第一个表示参数类型,第二个表示返回参数当使用偏函数时,会遍历集合的所有元素,编译器执行流程时先执行 isDefinedAt()如果为 true ,就会执行 apply, 构建一个新的 Int 对象返回...原创 2019-12-02 11:25:08 · 396 阅读 · 0 评论 -
Scala 之 模式匹配详解
match 基本介绍Scala 中的模式匹配类似于 Java 中的 switch 语法,但是更加强大。模式匹配语法中,采用 match 关键字声明,每个分支采用 case 关键字进行声明,当需要匹配时, 会从第一个 case 分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下 一个分支进行判断。如果所有 case 都不匹配,那么会执行 case _ 分支,类似于 Jav...原创 2019-12-01 14:05:43 · 482 阅读 · 0 评论 -
Scala 之 并行计算
并行计算:Scala为了充分使用多核CPU,提供了并行集合(有别于前面的串行集合),用于多核环境的 并行计算。主要用到的算法有:Divide and conquer : 分治算法,Scala 通过 splitters(分解器),combiners(组合器)等抽象层来实现,主要原理是将计算工作分解很多任务,分发给一些处理器去完成,并将它们处理结果合并返回Work stealin 算法【学...原创 2019-12-01 06:49:16 · 1433 阅读 · 0 评论 -
Scala 之Stream(流), View(视图)
Stream (流)stream 是一个集合。这个集合,可以用于存放无穷多个元素,但是这无穷个元素并不会一次性生 产出来,而是需要用到多大的区间,就会动态的生产,末尾元素遵循 lazy 规则 (即:要使用结果才进行 计算的) 。下面代码的意思是:Stream 集合存放的数据类型是 BigIntnumsForm 是自定义的一个函数,函数名是程序员指定的。创建的集合的第一个元素是 n , ...原创 2019-12-01 05:29:13 · 796 阅读 · 0 评论 -
Scala 之 拉链zip
拉链zip拉链的本质就是两个集合的合并操作,合并后每个元素是一个 对偶元组。操作的规则下图:如果两个集合个数不对应,会造成数据丢失。集合不限于 List, 也可以是其它集合比如 Array如果要取出合并后的各个对偶元组的数据,可以遍历object ZipDemo01 { def main(args: Array[String]): Unit = { // 拉链 ...原创 2019-12-01 02:13:15 · 361 阅读 · 0 评论 -
Scala高阶函数之 map, reduce, flatMap(扁平化), fold(折叠), scan(扫描)
高阶函数:高阶函数是指使用其他函数作为参数、或者返回一个函数作为结果的函数。在Scala中函数是“一等公民”,所以允许定义高阶函数。这里的术语可能有点让人困惑,我们约定,使用函数值作为参数,或者返回值为函数值的“函数”和“方法”,均称之为“高阶函数”。最常见的一个例子是Scala集合类(collections)的高阶函数mapobject HighOrderFunDemo02 { def...原创 2019-12-01 02:12:21 · 1564 阅读 · 0 评论 -
Scala 之 Map 操作大全
Scala的Map简介1) Scala 中的 Map 和 Java 类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,Scala 中不可变的 Map 是有序的,可变的 Map 是无序的。2) Scala 中,有可变Map(scala.collection.mutable.Map)和不可变Map(scala.collection.immutable.Map)不可变...原创 2019-11-29 08:53:21 · 2175 阅读 · 0 评论 -
Scala 之 队列(Queue) 入门
Scala的队列:队列是一个有序列表,在底层可以用数组或是链表来实现。其输入和输出要遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取在 Scala 中,由设计者直接给我们提供队列类型 Queue 使用。在 scala 中, 有 scala.collection.mutable.Queue 和 scala.collection.immutable.Queue , 一般来说...原创 2019-11-27 08:45:08 · 3052 阅读 · 0 评论 -
Scala 之 List 与 ListBuffer 入门
Scala的ListScala 中的 List 和 Java List 不一样,在 Java 中 List 是一个接口,真正存放数据是 ArrayList,而 Scala 的 List 可以直接存放数据,就是一个object,默认情况下 Scala 的 List 是不可变的,List 属于序列 Seq.val List = scala.collection.immutable.Listobj...原创 2019-11-27 08:04:41 · 3989 阅读 · 0 评论 -
Scala 之 元组(Tuple)入门
元组元组Tuple的操作说明 tuple1 就是一个 Tuple 类型是 Tuple5为了高效的操作元组,编译器根据元素的个数不同,对应不同的元组类型, 总共22种, 所以长度最多为22// 分别 Tuple1----Tuple22 val tuple1 = (1, 2, 3, "hello", 4) println(tuple1) //访问元组 val t1 = ...原创 2019-11-27 07:38:15 · 1599 阅读 · 0 评论 -
Scala 之 Scala容器与Java容器转换(最新版API)
Scala 之 Scala容器与Java容器转换import scala.collection.mutableimport scala.collection.mutable.ArrayBufferobject ArrayBuffer2JavaList { def main(args: Array[String]): Unit = { // Scala 集合和 Java 集合互相...原创 2019-11-26 14:50:07 · 701 阅读 · 0 评论 -
Scala 之 Array, ArrayBuffer 详解
第一种方法定义数组这里的数组等同于 Java 中的数组,中括号的类型就是数组的类型val arr1 = new Array[Int](10), 集合元素采用小括号访问arr1(1) = 7object ArrayDemo01 { def main(args: Array[String]): Unit = { //说明 //1. 创建了一个 Array 对象, ...原创 2019-11-26 06:35:57 · 6580 阅读 · 0 评论 -
Scala 之 隐式值, 隐式函数和隐式类
先看一段代码,引出实际需求 => 指定某些数据类型的相互隐式转化object Scala01 { def main(args: Array[String]): Unit = { val num: Int = 3.5 //?错 高精度->低精度 println(num) }}隐式函数基本介绍:隐式转换函数是以 implicit 关键字声明的带有单...原创 2019-11-25 12:04:11 · 396 阅读 · 0 评论 -
Scala 之 Trait(特质)高级特性----动态混入、 静态混入
首先, Trait动态混入是什么?Trait除了可以在类声明时继承特质以外,还可以在构建对象时混入特质,扩展目标类的功能此种方式也可以应用于对抽象类功能进行扩展动态混入是 Scala 特有的方式 (java 没有动态混入),可在不修改类声明/定义的情况下,扩展类的功能,非常的灵活,耦合性低 。动态混入可以在不影响原有的继承关系的基础上,给指定的类扩展功能。同时要注意动态混入时,如果抽...原创 2019-11-20 08:05:33 · 1918 阅读 · 0 评论 -
Scala 之特质(Trait)简介
长话短说:Trait 在 Scala 中相当于 Java 中 Interface 和 Abstract Class 的结合体, Scala 引入Trait 特征机制, 首先可以替代和兼容Java 接口和抽象类, 其次也是对单继承机制的一种弥补.Trait快速入门示例一 静态声明Trait:object TraitDemo02 { def main(args: Array[String...原创 2019-11-20 06:24:41 · 325 阅读 · 0 评论 -
Scala 之伴生对象总结
Scala 中伴生对象采用 object 关键字声明,伴生对象中声明的全是 "静态"内容,可以通过伴生 对象名称直接调用。伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问从语法角度来讲,所谓的伴生对象其实就是类的静态方法和成员的集合从技术角度来讲,scala 还是没有生成静态的内容,只不过是将伴生对象生成了一个...原创 2019-11-19 05:47:26 · 646 阅读 · 0 评论 -
从 jvm 动态绑定的机制来看 Scala 覆写方法和属性
基本介绍在 Scala 中,子类改写父类的字段,我们称为覆写/重写字段。覆写字段需使用 override 修饰。回顾:在 Java 中只有方法的重写,没有属性/字段的重写,准确的讲,是隐藏字段代替了重写回顾-Java 另一重要特性: 动态绑定机制动态绑定的机制:public class JavaDaynamicBind { public static void main(Str...原创 2019-11-18 10:48:19 · 261 阅读 · 0 评论 -
Scala 对包使用别名
将 Java HashMap 所有元素导入到Scala HashMappackage scalaimport scala.language.postfixOpsimport java.util.{HashMap => JavaHashMap}import collection.mutable.{HashMap => ScalaHashMap}object ImportD...原创 2019-11-17 10:49:54 · 1060 阅读 · 0 评论 -
浅谈Scala 2.8的包对象(package object)
Scala 2.8提供包对象(package object)的新特性。什么是包对象呢?按我的理解,根据Scala“一切皆对象”设计哲学,包(package)也是一种对象。既然是对象,那么就应该有属性和方法,也可以在包对象内声明某个类型的别名。举个例package com{ package object ggd543{ type HashMap[A,B] = scala.colle...原创 2019-11-17 09:52:13 · 409 阅读 · 0 评论 -
Scala 构造器高级特性详解
java构造器回顾首先回顾一下Java 构造器基本语法[修饰符] 方法名(参数列表){ 构造方法体}如果程序员没有定义构造方法,系统会自动给类生成一个默认无参构造方法(也叫默认构造器), 比如 Person (){}一旦定义了自己的构造方法(构造器), 默认的构造方法就覆盖了,就不能再使用默认的无参构造方法,除非显示的定义一下,即: Person(){};Person ...原创 2019-11-16 10:26:45 · 371 阅读 · 0 评论 -
Scala面向对象的底层实现详解以及与java的区别(一)
Scala 是100%面向对象, java是95%面向对象Java是面向对象的编程语言,由于历史原因,Java中还存在着非面向对象的内容:基本类型, null,静态方法等。Scala语言来自于Java,所以天生就是面向对象的语言,而且Scala是纯粹的面向对象的语言, 即在 Scala 中,一切皆为对象。在面向对象的学习过程中可以对比着 Java 面向对象的方式解决养猫问题mia...原创 2019-11-15 05:49:24 · 718 阅读 · 0 评论 -
Scala 之异常处理
Scala 异常简介:Scala提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有任意数量的 try…catch 块。语法处理上和 Java 类似,但是又不完全相同Java 异常处理回顾java语言按照try—catch-catch…—finally的方式来处理异常不管有没有异常捕获,都会执...原创 2019-11-14 12:58:52 · 1160 阅读 · 0 评论 -
Scala 之惰性函数
为什么需要惰性函数惰性计算(尽可能延迟表达式求值)是许多函数式编程语言的特性。惰性集合在需要时提供其元素,无需预先计算它们,这带来了一些好处。首先,您可以将耗时的计算推迟到绝对需要的时候。其次,您可以创造无限个集合,只要它们继续收到请求,就会继续提供元素。函数的惰性使用让您能够得到更高效的代码。Java并没有为惰性提供原生支持, Scala提供了,使用很方便。java实现懒加载懒汉...原创 2019-11-14 10:38:31 · 491 阅读 · 0 评论 -
Scala函数12点注意事项以及细节
Scala函数注意事项12点函数的形参列表可以是多个, 如果函数没有形参,调用时 可以不带()形参列表和返回值列表的数据类型可以是值类型和引用类型package com.haoxuanli.csdnobject Details01{ def main(args:Array[String]):Unit={//形参列表和返回值列表的数据类型可以是值类型和引用类型 val ...原创 2019-11-14 06:52:55 · 298 阅读 · 0 评论 -
Scala 定义方法的几种方式
scala中定义函数的几种方式如下:1.规范化写法, scala 函数的返回值是最后一行代码;def addInt(a: Int, b: Int): Int = { var total: Int = a + b return total}Unit, 是Scala语言中数据类型的一种, 表示无值,用作不返回任何结果的方法;def returnUnit(): Unit = {pr...原创 2019-11-13 04:51:51 · 1507 阅读 · 2 评论 -
Scala 数值转换知识点
原创 2019-11-12 07:00:46 · 223 阅读 · 0 评论 -
Scala 知识点小测验(附答案) 01
在 Scala REPL 中键入3,然后按TAB键。有那些方法可以被应用?scala> 3.!= ## % & * + - / < <...原创 2019-11-12 05:43:06 · 421 阅读 · 0 评论 -
Scala 小测验01
在 Scala REPL 中键入3,然后按TAB键。有那些方法可以被应用?scala> 3.!= ## % & * + - / < <...原创 2020-01-30 04:32:16 · 214 阅读 · 0 评论 -
Scala 数据类型详解
直接上图 在 scala 中有一个根类型 Any ,他是所有类的父类.scala中一切皆为对象,分为两大类AnyVal(值类型),AnyRef(引用类型),他们都是Any子类.Null 类型是 scala 的特别类型,它只有一个值 null, 他是 bottom calss ,是 所有 AnyRef 类型的子类.Nothing类型也是bottomclass,他是所有类的子类,在开发中...原创 2019-11-11 12:07:18 · 489 阅读 · 0 评论 -
反编译观察 Scala val 和 var 区别
package com.atguigu.chapter01.varsobject VarDemo03 { var name = "hello" val age = 100 def main(args: Array[String]): Unit = { println("ok") }}对应的底层的反编译的代码publicfinal class VarDemo...原创 2019-11-11 11:25:34 · 333 阅读 · 0 评论