scala

A 9-post collection

Scala模式匹配的`@`操作符

阅读Spark源码的时候,经常碰到模式匹配中带着@这样的写法,如: object CombineLimits extends Rule[LogicalPlan] { def apply(plan: LogicalPlan): LogicalPlan = plan transform { case ll @ Limit(le, nl @ Limit(ne, grandChild)) => Limit(

拿Scala的Parser写了个解析JSON二维数组的工具

感叹Scala的语法解析器之强大,几行代码就可以搞定我的解析需求,可惜相比专门的JSON解析库(ObjectMapper,fastjson)性能还差很多,不确定是否和apply的处理有关,抽空在研究下。 package cn.zhaishidan.test import scala.util.parsing.combinator.syntactical._ import scala.util.parsing.input.CharArrayReader import scala.

小心Scala/Java的split函数

最近使用scala在spark上做开发,遇到一个怪异的问题,代码逻辑没问题,最终处理的数据居然不合逻辑。起初以为是spark的问题,最终排查后发现是scala的split函数的问题。 也不能说是scala的split函数有问题吧,它的split默认行为与其他语言不一样。 在python下: a = '1,2,3,,,'.split(',') # a的值为['1', '2', '3', '', '', ''] 在js下: a

Scala变量和关键字重名的问题

如果定义的变量和scala了重名了,比如type,import,可以通过以下方式解决: val `type` = "string" 将变量使用两个`括起来即可,使用变量时,也需要带着。

Scala中的隐式转换、隐式参数和隐式类

隐式转换是scala中一个非常重要的概念,在scala中到处可见, 隐式转换 先看代码: class Info class RichInfo(info: Info) { def show { println("RichInfo ...") } } object Test extends App { implicit def info2Rich(info: Info) = new RichInfo(info)

Scala的类型约束

在scala中可以通过隐式参数来进行类型约束。 先来看一串代码: def test[T](i:T)(implicit ev: T <:< java.io.Serializable) { print("OK") } 上述代码中的<:<表示T类型属于java.io.Serializable类型的子类。 类似的还有=:=,也就是说: A

使用SBT构建Scala项目

sbt可是说是scala下的maven,用来构建项目甚是方便。 sbt使用Ivy管理包依赖,依赖的包会从maven中央库中下载,当然也可以指定特定的中央库。 sbt相比maven有一定的学习成本,但是他支持scala定义任务,而且描述项目信息比maven简单很多,支持增量式编译和交互式操作,所以还是非常值得学习一下的。 sbt的一些常用命令: clean 删除target目录中所有自动生成的文件 compile 编译main目录(src/main/scala, src/main/java)中的源文件 test 编译并执行测试用例 console 打开一个scala解释器,

Scala常见的字符串插值

s插值器 可以解析字符串中的变量,可以调用方法,还能进行计算。实际调用的是 StringContext 中的 s 方法。 var name = "test" println(s"Hi $name") println(s"Hi ${name}qq") f插值器 它除 s 的功能外(不指定格式就和

Scala的import语法总结

scala的import灵活而又强大,正因如此,学习的成本也高了。 导入一个包下的所有类型: import package.test._ 单独导入一个类(MyClass): import package.test.MyClass 导入一个类下的所有成员: import pcakge.test.MyClass._ 在scala中import可以写在任意地方,这样可以通过外层的作用范围减少引用范围: def method(fruit: Fruit) { import fruit.