Scala语言
文章平均质量分 90
面向Scala编程语言,讨论语法,编程技巧等
Laurence
架构师,著有《大数据平台架构与原型实现:数据中台建设实战》一书,对大数据、云计算、数据湖、数据中台、企业级应用架构、域驱动设计有丰富的实践经验。
展开
-
重磅推荐:建大数据平台太难了!给我发个工程原型吧!
故事缘起:我们需要工程原型!大数据平台的架构体系庞大,技术堆栈非常深,从事大数据开发的同学对此应该都深有体会。而在很多细分领域(例如实时计算、作业调度)也没有像样的工程模板,这导致很多团队在启动大数据平台建设时往往感到无所侍从,也使得希望深入学习大数据技术的开发者由于缺少工程级的示例参考而感到迷茫。如果在大数据领域也有基于最佳实践提炼出来的工程原型,帮助团队快速启动开发,上手就写业务代码的话,你想了解一下吗?原创 2020-06-19 11:27:26 · 8071 阅读 · 13 评论 -
应该广泛使用case语句简化函数字面量的实现
这篇文章很短,但足以单独作为一篇文章存在,因为这里介绍的这个Scala编程技巧非常的实用和高效。在Scala里我们需要大量地编写一些函数字面量作为参数传递给高阶函数,而很多时候,被要求提供的函数字面量的参数是一些复合类型,比如tuple,在函数字面量的实现体中,往往第一步就是通过模式匹配从复合类型中提取出嵌套的变量进行计算,例如下面计算元组两元素平方差的例子:scala> v...原创 2018-05-03 15:40:23 · 987 阅读 · 0 评论 -
谨慎使用Scala Map的mapValues, 你需要的可能是transform
没有踩过mapValues的坑之前,我相信大多数人会认为mapValues和所有其他map类方法的逻辑是一样的:对Map里所有的value施加一个map函数,返回一个新的Map。但实际情况却并不这么简单,还是先看一段“诡异”的代码吧 (本文原文出处: 本文原文链接: http://blog.csdn.net/bluishglc/article/details/80156218 转载请注明出处。):...原创 2018-05-01 14:07:48 · 13903 阅读 · 4 评论 -
再谈Scala集合
集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下。集合“族谱”还是先上张图吧,这是我找到的最好的一个关于Scala集合的图了,出自:http://lkumarjain.blogspot.co.id/2015/01/scala-collection-framework.html :一致的构建风格原创 2017-12-14 14:01:05 · 1448 阅读 · 0 评论 -
Scala之自身类型(Self Type)与蛋糕模式(Cake Pattern)
目录设计一辆车第一版的实现基于继承第二版的实现基于组合引入自身类型Self Type引入蛋糕模式Cake Pattern利弊得失本文基于Gregor Heine分享的PPT《Scala Self-Types》注解式地介绍自身引用(Self Type)和蛋糕模式(Cake Pattern),原PPT解释地非常好,感兴趣的朋友可以自行下载阅读。设计一辆车一辆汽车往往会包含这样一些组件:En原创 2017-03-07 08:26:12 · 7267 阅读 · 1 评论 -
站在新语言平台上再谈“组合”与“继承”
长久以来,OO编程思想的一个重要信条是:多用组合,少用继承,这被广为接受和认可。Scala引入Trait(特质)之后,这一点“似乎”受到了冲击,你可以看到,在很多Scala代码里出现了通过继承多个Trait为一个Class混入(追加)新功能的案例,而其中有不少案例是过去我们在传统OO语言(例如Java)中不会或不建议的做法,因为看上去那确实是在滥用继承。举个简单的例子,日志功能是非常普遍的需求,传统原创 2017-03-06 08:27:01 · 2520 阅读 · 1 评论 -
我们为什么放弃SBT回归Maven
显然,我是在说Scala项目。在我们讨论这个话题时,SBT的稳定版本是0.13,我想再过几年,本文提及的问题会一一得到解决,从而让SBT成为一个真正成熟强大的构建工具。在我们目前开发的系统中,有一个基于AKKA的组件,使用Scala语言进行编程。绝大多数情况下,构建Scala项目首选的工具是SBT,作为新一代的构建工具,SBT吸收了众多前辈的优点,简单易用,能够满足基本的应用场景。但是SBT确实还不原创 2017-02-27 08:34:04 · 11589 阅读 · 5 评论 -
Scala之::的研究
一个很细节的问题,简单总结一下。::在Scala里有两种含义,一种是List集合的一个方法,用于把一个元素添加到集合的前面;另一种表示一个非空的List集合,往往应用于模式匹配中。第一种用法: List的一个方法,用于在头部添加新元素示例代码1 :: List(2, 3) = List(2, 3).::(1) = List(1, 2, 3)这种写法在Scala里极为常见,但是会让初学者感到困惑:既然原创 2017-02-18 16:25:09 · 2318 阅读 · 0 评论 -
基于Akka-Streams的HTTP代理的实现
Akka-Streams是一个让人激动的Reactive Streams的框架,Akka-Http也是构建在其之上,除了内置背压模式的支持,使用其DSL构建一个Graph也是一个让人惊艳的过程。对于Akka-Streams的介绍会在后续的文章中逐一展开,本文只奉上一段代码,实现的是HTTP代理功能,同时可以对请求和响应做一些修饰。import akka.NotUsedimport akka.act原创 2017-02-18 12:16:16 · 5271 阅读 · 1 评论 -
Scala之集合上常见的函数式风格的操作汇总
目录过滤相关的操作filter解释示例partition解释示例find解释示例takeWhile解释示例映射相关的操作map解释示例flatMap解释示例示例扁平化相关的操作flatten解释示例折叠相关的操作reduceLeft解释示例reduceRight解释示例foldLeft解释示例foldRight解释示例正文函数原创 2016-11-24 15:10:44 · 7304 阅读 · 0 评论 -
Actor系统的错误处理
Actor的层次结构Guardian ActorActor路径一个Actor层次机构的示例崩溃了怎办监管策略指令默认策略Actor的生命周期Actor的消亡自愈系统错误的核心超时Death Watch总结本文原文标题:《The Neophyte’s Guide to Scala Part 15: Dealing With Failure in Actor Systems翻译 2016-11-17 09:22:44 · 6965 阅读 · 2 评论 -
基于Actor的并发方案
共享可变状态的问题Actor模型Actor系统定义Actor消息处理副作用非类型化异步和非阻塞创建一个Actor发送消息消息应答问询Ask机制有状态的Actor小结译者注: 本文原文标题:《The Neophyte’s Guide to Scala Part 14: The Actor Approach to Concurrency》,作者:Daniel Westheid翻译 2016-11-14 07:36:45 · 8892 阅读 · 1 评论 -
Scala之小括号和花括号(Parentheses & Crurly Braces)
尽管这是一个非常基础的问题,但是如果不仔细梳理一下,还是会导致在某些场景下误读代码,原因是Scala对这个两兄弟的使用实在是太灵活了,甚至有些“随便”了,让我们分情况逐讨论一下。在调用函数时人们会笼统地说在函数调用时,小括号和花括号是通用的,但实际上,情况会复杂的如果你要调用的函数有两个或两个以上的参数,那么你只能使用“小括号”请看下面的示例:scala> var add = (x: Int,y:原创 2016-10-27 15:52:41 · 15868 阅读 · 5 评论 -
Scala之若干细小问题汇总
Scala中下划线的应用场景一Scala中下划线的应用场景二identity方法的应用场景Scala中下划线的应用场景(一)1、作为“通配符”,类似Java中的*。如import scala.math._2、:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。3、指代一个集合中的每个元素。例如我们要在原创 2016-10-13 14:24:55 · 4000 阅读 · 0 评论 -
Scala之TypeTags and Manifests
Scala之TypeTags和Manifests注:本文为译文,原文是Scala官方文档中的一篇,这里翻译出来作为本系列的一篇文章。原文链接: http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html。 Scala之TypeTags和Manifests获取一个TypeTag通过typeTagclassTag或w翻译 2016-09-20 15:43:09 · 3898 阅读 · 0 评论 -
Scala之“逆变”合理性的思考
Scala之“逆变”合理性的思考对于逆变的概念可以参考本系列的前一篇文章: Scala之类型参数化:Type Parameterization 本文的重点是要解释“逆变”的合理性。在思考“逆变”的合理性这个问题上,我们需要清晰地认识到一个前提,即父类与子类之间的关系实质,我们说:如果类A是类B的父类,那么所有出现类A声明的地方,我们都可以使用类B的实例进行替换,或者说所有适用于类A的操作同样适用于类原创 2016-09-19 15:07:36 · 3250 阅读 · 1 评论 -
Scala之类型参数化:Type Parameterization
Scala之类型参数化:Type ParameterizationScala之类型参数化Type Parameterization型变Variance不变 Invariant协变Covariant逆变Contravariant类型参数的边界控制下界Lower Bound上界Upper Bound视界View Bound上下文边界Context Bound型变:Variance型变试原创 2016-09-19 11:42:46 · 4251 阅读 · 0 评论 -
Scala之Option
机场等飞机,继续学习Scala~~Option是一个很有意思的类,首先,这个类并不一个真正的集合类,因为它并没有有继承Traversable或Iterable。但是,它确实具有Iterable的所有操作,这意味着你完全可以把Option当成一个集合去使用,其中原因你应该可以猜的到,这显然是隐式转换在起作用。具体来说是Option的伴生对象中定义了一个隐式转化函数option2Iterable, 你还原创 2016-05-01 16:15:57 · 12940 阅读 · 1 评论 -
Scala之集合Collection
概述Scala的集合类可以从三个维度进行切分:可变与不可变集合(Immutable and mutable collections)静态与延迟加载集合 (Eager and delayed evaluation )串行与并行计算集合(Sequential and parallel evaluation )关于第一个维度我想我们不需要再介绍了。关于第二维度,是这样解释的, 首先我们来解释一个概原创 2016-04-07 14:50:39 · 11031 阅读 · 1 评论 -
Scala之模式匹配(Patterns Matching)
前言首先,我们要在一开始强调一件很重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中,这是Scala模式匹配之所以重要且有用的一个关键因素!我们会在文章的后半部分详细地讨论这一点。模式匹配的种类在Scala中一共有如下几种类型的模式匹配:通配符匹配(Wildcard Pattern Matching )常量匹配 (Constant Pattern Matching原创 2016-04-04 13:44:23 · 15874 阅读 · 0 评论 -
Scala之Partially Applied Function和Currying
Partially Applied Function在开始之前,还是让我们说说”apply”这个术语怎么解释吧。在scala里,我们认为:把一个参数传递给函数的过程就叫apply, 在传统的编程语言里,传递参数和调用函数是一个过程,并不存在apply这一说,但是在像scala这样的函数式编程语言里,“apply”和“invoke”这两个动作是可以分离开的,所以才有了Partially Apply这样原创 2016-04-02 10:39:02 · 4600 阅读 · 0 评论 -
Scala之偏函数Partial Function
本文原文出处: http://blog.csdn.net/bluishglc/article/details/ 严禁任何形式的转载,否则将委托CSDN官方维护权益!从使用case语句构造匿名函数谈起在Scala里,我们可以使用case语句来创建一个匿名函数(函数字面量),这有别于一般的匿名函数创建方法。来看个例子:scala> List(1,2,3) map {case i:Int=>i+1}re原创 2016-03-28 10:27:45 · 33420 阅读 · 8 评论 -
Scala之Case Class
Case Class的特别之处在于:编译器会为Case Class自动生成以下方法: equals & hashCodetoStringcopy编译器会为Case Class自动生成伴生对象编译器会为伴生对象自动生成以下方法applyunapply 这意味着你可以不必使用new关键字来实例化一个case class.case class的类参数在不指定val/var修饰时,会自动编原创 2016-03-17 15:11:46 · 24767 阅读 · 0 评论 -
Scala之主构造函数
主构造函数首先,我们必须要非常清晰明确的认识到:主构造函数不是你看到class后面跟的参数列表,那怎么可能是主构造函数呢?那只是主构造函数的函数列表!那主构造函数的函数体在那里呢?答案是:class body里所有出去字段和方法声明的语句,剩下的一切都是主构造函数的,它们在class实例化时一定会被执行的。所以说,Scala的主构造函数包含这些部分:The constructor paramete原创 2016-03-15 19:10:19 · 21710 阅读 · 2 评论 -
类型类 V.S. 桥接模式:撞衫不可怕,谁丑谁尴尬
缘起设计模式是建立在编程语言层面之上的,从某种角度上看,模式是以应用场景为导向,在编程语言的基础设施之上构建的最佳设计的范本,其价值在于可以作为模版应用于同类场景中。而反过来,语言基础设施的改变必然会影响到上层的设计模式,设计模式和编程语言相互影响,新的编程范式会催生新的设计模式,而成熟的设计模式会引导在语言在基础层面上进行进化从而直接支持!这类的案例是非常多的,比如:Java语言原生支持原型模式、原创 2016-03-15 11:19:15 · 4475 阅读 · 0 评论 -
Scala之隐式转换
概述简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型。隐式转换有四种常见的使用场景:将某一类型转换成预期类型类型增强与扩展模拟新的语法类型类语法隐式转换有新旧两种定义方法,旧的定义方法指是的“implict def”形式,这是Scala 2.10版本之前的写法,在Scala 2.10版本之原创 2016-03-12 16:53:41 · 31315 阅读 · 6 评论 -
关于“闭包”的杂文
定义关于闭包有太多种解释,但基本上都很难用一两句解释清楚,下面这句简短的定义是我见过的最精炼且准确的解释了:A closure is a function that carries an implicit binding to all the variables referenced within it. In other words, the function (or method) enclos原创 2016-01-24 16:13:26 · 4996 阅读 · 3 评论 -
从函数字面量发现函数式编程
版权声明:本文由本人撰写并发表于2015年3月下半月的《程序员》杂志,原文题目《从字面量发现函数式编程》,本文版权归《程序员》杂志所有,未经许可不得转载。引言我相信很多像我一样初次接触函数式编程的程序员来说,对于“函数字面量”这个概念会感到迷惑和不解。伴随着深入地学习,在清晰地理解了这个概念之后,我进行了一些梳理和回溯,作为函数式编程思想延伸到最基层的语言元素,我深刻地觉得“函数字面量”这原创 2015-04-27 11:54:09 · 9680 阅读 · 6 评论 -
SCALA学习笔记(二)
SCALA学习笔记(二)SCALA学习笔记二泛型在继承中的类型变化InvariantCovarianceContravarianceCovarianceContravarianceCall-ByNameCurrying柯里化初探lambda和closure的区别集合二维运算foldLeft foldRightFunction ObjectPartial Fu原创 2015-03-30 07:55:47 · 10989 阅读 · 0 评论 -
SCALA学习笔记(一)
变量获取变量的值是一个耗时的工作时,可以考虑使用lazy var. lazy val forLater = someTimeConsumingOperation()scala> val first :: rest = List(1, 2, 3) first: Int = 1 rest: List[Int] = List(2, 3)函数定义“=”并不只是原创 2015-02-27 08:46:43 · 29145 阅读 · 1 评论