
Scala学习指南
文章平均质量分 60
齐梦星空
专注
展开
-
scala with cats 之 Contravariant Functors and Invariant Functors
概述Functor的意思是,如果有个F[A]和函数A=>B,那么就能得到一个F[B]。而Contravariant Functors的意思是,如果有个F[B],然后有个函数A => B,那我们就能得到一个F[A]。用途假如我们有个类型类,比如说trait Semigroup[A]{ def combine(x:A,y:A):A}我们经常要定义各种实例,比如Semigroup[Int],Semigroup[String],比如Semigroup[Boolean]。这些都是cats原创 2021-07-24 16:56:58 · 311 阅读 · 0 评论 -
Revisiting Tagless Final Interpreters
Revisiting Tagless Final InterpretersTageless Final interpreters are an alternative to the traditional Algebraic Data Type (and generalized ADT) based implementation of the interpreter pattern. This document presents the Tageless Final approach with Scala原创 2021-02-08 11:08:45 · 379 阅读 · 1 评论 -
scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下
traittrait不能有构造函数trait people(name:String) // errortrait people(val name:String) // errortrait people(var name:String) // errortrait people{name:String} // errortrait people{val name:String} // righttrait people{var name:String} // righttrait的继原创 2021-01-11 11:14:32 · 319 阅读 · 0 评论 -
scala项目的全局配置实践
定义一个 object 放一些常量名,相当于各种属性的key值object MktEnvironmentContants { // 系统环境变量 val KEY_UAP_ZK_SERVER = "uap.zk.server" val KEY_UAP_SERVICE_CONSOLE_PORT = "uap.service.console.port" val KEY_UAP_SERVICE_ANALYZE_PORT = "uap.service.analyze.port" val KE.原创 2021-01-08 14:32:43 · 362 阅读 · 0 评论 -
scala 上界 <:, 下界>:, 视界 <%, 边界 :, 协变 +T, 逆变-T
概述上界 (<:) 下界(>:) 是类型约束范畴,用来约束对象的子类是谁,父类是谁协变 (+T) 逆变(-T)是泛型范畴,主要用于集合类型变量赋值。视界 (<%) 边界( :)是隐式调用的简写。上界 (<:) 下界(>:)上界:要求对象必须是某一个对象的子类,因为子类会继承父类的属性和方法,所以父类的方法和属性这路都可以用。 trait A { def func() } class B extends A { override def fu原创 2020-08-29 18:28:44 · 593 阅读 · 0 评论 -
scala反射详解
概述Scala 的反射分为两个范畴:运行时反射:通常意义上的反射编译时反射:宏,或者元编程这两者之间的区别在于Environment, 而Environment又是由universe决定的. 反射的另一个重要的部分就是一个实体集合,而这个实体集合被称为mirror,有了这个实体集合我们就可以实现对需要反射的类进行对应的操作,如属性的获取,属性值得设置,以及对反射类方法的调用(其实就是成员函数的入口地址, 但请注意, 这只是个地址)!可能有点绕, 说的直白点就是要操作类方法或者属性就需要获得指定的原创 2020-08-29 11:22:34 · 2702 阅读 · 0 评论 -
scala trait,class 和 object在内存中的状态
traittrait的变量并不能直接访问,说明不是静态的.trait既能被class继承也能被object继承每一个继承trait的类生成实例的时候(无论是class还是object)都换先生成一个trait实例(或者说对象)java的属性是static final的,全局唯一。而trait的属性实际上是方法调用而已。class Son()trait Father { println("i am trait") val son = new Son() var b = new So原创 2020-06-29 16:40:36 · 285 阅读 · 0 评论 -
事实也许和你想的不一样:volatile,原子类,synchronized在scala的Thread,线程池,Future中使用对比
在scala和java中通常用于数据同步的材料有volatile关键字,原子类,synchronized关键字。但是在不同的多线程环境下,产生的效果却并不相同。实验在独立线程环境下使用volatile关键字,原子类,synchronized关键字构造1000个独立的Thread实例同时启动 // 不使用任何同步机制 var i: Int = 0 (0 to 10000) foreach (_ => new Thread() { i = i + 1 }.原创 2020-06-21 11:19:11 · 896 阅读 · 2 评论 -
scala的代码块 和 无参代码的区别
前言最近在创建线程的时候写了如下代码,然后发现线程内的 run 方法总是无法执行:object MyThread { def thread(body: => Unit): Thread = { val thread = new Thread { override def run(): Unit = body } thread.start() thread } def main(args: Array[String]): Unit =原创 2020-05-26 11:49:09 · 283 阅读 · 0 评论 -
scala类型判断关键字:isInstanceOf和asInstanceOf,getClass和classOf
isInstanceOf和asInstanceOfisInstanceOf:isInstanceOf用于判断对象是否是某类或者某类子类的实例asInstanceOf:相当于java的强制类型转换class Person { var name: String = "" var age: Int = 0 def this(name: String, age: I...原创 2020-04-27 16:46:51 · 548 阅读 · 0 评论 -
scala的Future和Promise
前言使用scala的Future和Promise就不得不提一下异步编程和多线程编程的区别。共同点:异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性不同点:线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。多线程在单个线程中的处理程序依然是顺序执行,符合普通人的思维习...原创 2020-03-30 16:39:06 · 859 阅读 · 0 评论 -
scala有什么优点?
面试腾讯的时候突然问我这个问题,闲来无事总结一下。写scala的代码更容易表达思路。也就是你脑子想到那你就可以写到哪,但是这个是优点也是缺点,这种方式编写的代码易写难懂,拓展性差。当然这种优点只是个人感觉,因为scala的是一个多范式语言,他也能像java那样编写出架构精巧,扩展性强的代码。scala具有优秀的类型推断功能。比如定义:val s = "name".这样的代码,不需要显示声明,...原创 2020-03-29 22:27:33 · 2540 阅读 · 0 评论 -
scala隐式详解
定义使用implicit 关键字 implicit val rate: Float = 0.05F implicit def float2Int(float: Float) = { float.toInt }隐式参数调用方法时,如果未输入隐式参数且代码所处作用域中存在类型兼容的隐式值,该值会从作...原创 2019-09-28 23:49:35 · 293 阅读 · 0 评论 -
scala的函数为什么参数都是逆变的而返回值都是协变的
在scala中,函数特质的定义都是类似下面的:trait FunctionN[-T1, -T2,-T3...-TN, +R] extends AnyRef也就是说参数都输逆变的,返回值都是协变的。在scala中,函数是一等公民,他可以像数组(数组也是支持逆变和协变的)被赋值和传参。所以函数必须要被支持赋值操作。如果一个函数要想赋值给另一个函数的指针(无论是直接赋值还是当做函数传参),函数的参...原创 2019-09-13 12:13:36 · 495 阅读 · 0 评论 -
Scala正则表达式+模式匹配
1.样例类:case class1.1 格式 case class ClassName(str:String) { … }1.2 特点样例类被声明后会自动生成工厂方法,即拥有apply()方法,可以通过ClassName(“…”)而不是new ClassName(“…”)实例化对象样例类的参数会被认为是val格式,既case class ClassName(str:S...原创 2018-06-06 09:15:22 · 350 阅读 · 0 评论 -
scala的正则表达式
正则表达式定义val pattern = "Scala".r //字符串后调用“r”方法val pattern = new Regex("(S|s)cala")原创 2019-01-28 14:40:05 · 230 阅读 · 0 评论 -
scala定义数组
数组的定义定义有固定元素的数组val arr = Array(1,2,3,4)定义定长数组val arr = new Array[Int](10) //声明定长数组要注意啊:1.关键字new。2.声明数据类型。3.声明长度。变长数组(ArrayBuffer)import scala.collection.mutable.ArrayBufferval array = ...原创 2019-02-14 09:29:44 · 4268 阅读 · 0 评论 -
函数柯里化,偏应用函数和普通函数的区别
1 闭包2 占位符3 函数柯里化原创 2019-04-28 23:43:14 · 358 阅读 · 0 评论 -
scala偏函数——不和match一起使用的case序列
1 case样本序列先看一段代码 val func1: Int => Int = { case x => 1 }等号的右边是{case x => 1},一对花括号包裹着一个case语句。这样的用法看到过很多次,但是很少有资料解释为什么可以这样用。查阅过很多资料,最终在《programming in Scala》(scala编程:黄海旭,高...原创 2019-04-29 13:16:00 · 944 阅读 · 1 评论 -
scala柯里化的不同的定义方法
对于下面这段代码我一直觉得很疑惑:def sum(s1: String) = (s2: String) => s1 + s2单从右边来看像是一个闭包,在 (s2: String) => s1 + s2原创 2019-04-30 19:04:09 · 112 阅读 · 0 评论 -
scala的构造函数
主构造函数里的参数,如果不声明为var或者val,则该参数只能被当做一个类内不可变参数使用,不能被当做类的字段,既外部不能访问该变量当为主构造函数的的参数添加var,或者val声明,则该参数被升级为类的成员变量...原创 2019-05-26 11:53:10 · 3691 阅读 · 1 评论 -
scala的定义变量的时候一定要初始化吗?如果不想初始化怎么办?
毫无疑问.对于这个问题回答肯定是:是那如果变量定义的时候不能初始化或者不希望立即对变量赋值怎么办?但是有两点比较重要的是:val的变量定义的时候必须赋值var的变量可以使用默认初始化,既用下划线对变量赋值,但是使用的时候要注意以下几点:默认初始化的变量类型要明确对于不同的类型变量,虽然都用下划线,但是初始化的值不同...原创 2019-05-26 12:13:29 · 6667 阅读 · 3 评论 -
scala的isEmpty,nonEmpty,idDefined
!seq.isEmpty -> seq.nonEmptyseq.size == 0 -> seq.isEmptyseq.size != 0 -> seq.nonEmpty!(seq.length > 1) -> seq.isEmpty!option.isEmpty -> option.isDefinedoption == None -> opti...原创 2019-06-04 10:29:00 · 4880 阅读 · 0 评论 -
scala的Option,Some,None
源码sealed abstract class Option[+A] extends Product with Serializable ………………final case class Some[+A](x: A) extends Option[A] { def isEmpty = false def get = x}case object None extends Optio...原创 2019-06-04 12:07:54 · 2960 阅读 · 0 评论 -
Scala教程(一)——基本数据类型及变量
1、基本数据类型Byte 8位有符号补码整数。数值区间为 -128 到 127Short 16位有符号补码整数。数值区间为 -32768 到 32767Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 92233720368...原创 2018-05-22 16:32:57 · 1056 阅读 · 0 评论