`
spartan1
  • 浏览: 361177 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

scala语言的一些体会

 
阅读更多

这两天用scala写了一些程序,有一些体会。

 

scala作为一种函数式语言,特别适合将多个小的匿名函数串联起来,作用到一个列表对象(Option/Either/List/Map等)上。并且这么做会减少一些想临时变量名字的功夫,诱惑人不断把这种串联持续下去。比如:

 

val match = Option(fileName).map(new File(_)).map(Path(_).slurpString).map {str =>
  val s = "^" + str + "$"
  s.r.pattern
}.map.(_.matcher("hello world").matches).get

 

这种代码看起来很简短,但写起来和读起来其实都很费力,因为连续的小函数之间,都是隐藏起来的数据在流转。这些数据是什么类型,必须根据小函数的返回值来确定。而任何一个小函数的输入,都需要从前一个小函数的返回值获得。这样要看懂一句话的涵义,就必须从头开始,中间不能有任何中断,否则就无法知道下一步是怎么做的。

 

这种做法对于比较简短的一些操作非常有用,类似在shell中使用管道将几个非常熟练的命令行命令串联起来,看起来一目了然,非常清晰。但在编程语言中,由于过多的小括号甚至大括号,换行和断句,要看懂一句话是非常困难的。

 

当然,上述命令可以使用中缀表达式省去一些"."和小括号,看起来好看一些:

 

  val match1 = Option(str) map (new File(_)) map (Path(_).slurpString) map {
      str => ("^" + str + "$").r.pattern
    } map {p => p matcher("hello world")}.matches.get 

 

但这仍然不够。shell中,无论何时,我们知道管道间的输入输出,实际上只有一种类型的数据:字节流,所以我们无需费心想这个命令的输出和那个命令的输入分别是什么类型的,最后实际上我们都几乎忘了某个命令的输出类型,直接就使用其字面语义就直接明白命令串的涵义了。但scala中不同。首先列表都有好几种类型:Option,Either,List,Map,虽然每种的操作名字都是类似的,但就是因为这种类似性,在看一句语句的过程中,经常忘了这个到底是什么列表类型,需要到头上去看一下。

 

更可悲的是,有时候在脑海中相处某个匿名函数的返回值也比较困难。最可悲的是,经常遇到某些函数有几行,此时用大括号括起来,并且换行处理,就会变得比较痛苦。

 

所以,这种串联的确非常有意义,不过要变得有用,必须简短,一个原则就是:一行搞定,然后赋值给一个变量。如果有多行,就多加几个中间变量。这样做的好处很明显:人的思维深度是有限的,在某个地方就应该停一下,把中间思考结果记下来,然后继续思考。上面的代码应该可以这样写:

 

val rstr = Option(str) map {new File(_)} map {Path(_).slurpString}

val pattern = rstr map {str => ("^" + str + "$").r.pattern}

val result = pattern map {p => (p matcher "hello world").matches} get

 

看着清爽了不少。可以与java代码比较一下:

 

File file = new File(str);
String content = (new Path(file)).slurpString();
Pattern p = ("^" + str + "$").r().pattern();
boolean result = p.matcher("hello world").matches();
 
分享到:
评论

相关推荐

    Scala语言分析报告

    Scala语言分析报告

    Scala语言规范-2019.rar

    Scala语言规范-Scala 是一门类 Java 的编程语言,它结合了面向对象编程和函数式编程。 Scala 是纯面向对象的,每个值都是一个对象,对象的类型和行为由类定义,不同的类可以通过混入(mixin)的方式组合在一起。 Scala...

    Scala语言入门

    Scala语言入门

    Scala语言规范.zip

    Scala语言规范.zip

    尚硅谷_韩顺平_Scala语言核心编程_PDF密码解除1

    第 1 章 SCALA 的概述 11.1 学习 SDALA 的原因11.2 SCALA 语言诞生小故事 1以及 JVM 的关系分析图21.4 SCALA 语言的

    Scala语言规范.pdf

    《Scala语言规范》非常有利于spark的学习。希望能够帮助到大家。

    Scala语言规范版本:2.7

    Scala是一门类Java的编程语言,它结合了面向对象编程和函数式编程。Scala是纯面向对象的,每个值都是一个对象,对象的类型和行为由类定义,不同的类可以通过混入(mixin)的方式组合在一起。

    scala语言教程及规范

    scala 从入门到精通以及各种使用规范,使用技巧的文档

    scala语言pdf_带目录标签

    快学Scala、scala函数式编程、Scala编程实战:三本书籍,带目录和标签

    尚硅谷大数据之Scala语言核心编程.pdf

    尚硅谷大数据scala语言核心编程,是大数据开发必备的技能。

    ID3算法scala语言实现

    完整的ID3决策树算法,采用了scala语言来实现,代码完整。

    Scala 语言文档.ctb

    大数据利器之scala开发语言文档,非常详细,一步步讲解。 spark开发语言scala,同样的结果java100行,scala10行。需要樱桃笔记打开

    Scala 语言规范

    Scala 是一门类 Java 的编程语言,它结合了面向对象编程和函数式编程。Scala 是 纯面向对象的,每个值都是一个对象,对象的类型和行为由类定义,不同的类可以通过混 入(mixin)的方式组合在一起。Scala 的设计目的是...

    Scala编程实战.zip

    学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景,提供了大量的Scala实例,同时,也给出底层的原理和相关的...

    尚硅谷_韩顺平_Scala语言核心编程

    尚硅谷的韩顺平老师的scala课程的完整课件,目录全,很不错的scala开发参考文档

    Scala语言规范.docx

    Scala语言的规范,从官网中下载得到的,资源质量清晰,word文档方便笔记。

    尚硅谷_韩顺平_Scala语言核心编程.pdf

    尚硅谷 韩顺平老师的scala视频教程讲义,配套笔记。挺不错的感觉。

    基于scala语言编写的SparkSQL

    文档以scala语言编写了sparkSQL查询数据的方式,没有打jar包运行,在spark命令行测试通过

    Scala语言参考 PDF

    Scala语言参考 PDF版本 Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格

Global site tag (gtag.js) - Google Analytics