《scala编程实战》读书笔记------前言和第一章前2小节

一、 首先谈谈前言

这本书是O’Reilly书籍,同时也是本很厚的书籍,至于多厚,京东一看便知,博主不多说,打开第一眼,基本上所有的书籍都是些前言和感谢信之类的东西(技术书籍的通病),但是我没有直接进入正文急着去看书籍的内容,正因为前言吸引了我(我的习惯一般是前言如果写得不错才会看下去,不然直接跳正文)。至于前言吸引我的地方,是因为不仅大致讲了书本的内容概览,还通过实例说明了scala的优劣性,因为scala基于java的JVM,所以有很多相似之处,其中还说明到scala相较于java来说,就是在某一些地方scala可以处理得更容易,让程序员从编码当中解脱出来。

二、 第一章---字符串

1、 从引言开始说起

//scala末尾一般是不加分号的,这点和python类似
println("Hello,world".getClass.getName)

结果:

 不言而喻,scala确实很多地方是基于java实现的

然后引言大致说了一点函数式编程(书籍应该是java8没出之前出版的,因为书籍当中有提到java不支持函数式,这点需要说明)

val result = "hello world".filter(_!='l')
println(result)

懂一点函数式的应该都知道返回结果是: heo word,因为filter在很多支持函数式编程语言当中都有用到,python,java8都可以实现此结果。但是scala的实现却不是java类,而是扩展出来的StringOps,其次列出了StringOps的层级结构和超类。

最后说一个例子:

println("scala".drop(2).take(2).capitalize)

说说我的感受吧,看到这段代码的时候其实并不知道是干嘛的,然后因为此需求我就去把src添加上,然后利用ctrl+左键的方式查看源码。

源码分别为:

override /*TraversableLike*/
def drop(n: Int): Repr = slice(n, length)
override /*TraversableLike*/
def take(n: Int): Repr = slice(0, n)
/** Returns this string with first character converted to upper case.
 * If the first character of the string is capitalized, it is returned unchanged.
 * This method does not convert characters outside the Basic Multilingual Plane (BMP).
 */
def capitalize: String =
  if (toString == null) null
  else if (toString.length == 0) ""
  else if (toString.charAt(0).isUpper) toString
  else {
    val chars = toString.toCharArray
    chars(0) = chars(0).toUpper
    new String(chars)
  }

懂一点语言的都应该知道slice代表的是啥,这时我才恍然大悟,这并不是什么很高深的东西,其实就是2个截取字符串的方法,然后看了最后一个方法的注释就知道首字母大写,最后得出结果Al,当然书籍当中花了不少篇幅阐述了这些用法,但是如果想把一本书籍看得比较快一点,不能一心的去咬文嚼字,得靠自己的经验学习新的东西,这是博主的感受。

2、 测试字符串相等

我开始看到例子的时候还是有一点惊讶的,例子如下

val s1 = "Hello"
val s2 = "Hello"
println(s1 == s2)
val s3 = "hello"
println(s1.toUpperCase == s3.toUpperCase)
//null不能调用方法
val s4 = null
val s5 = null
println(s4 == s5)
//    println(s4.toUpperCase == s5.toUpperCase)

当时我的感受是既然scala基于java,为什么不是equals方法判断字符串相等,然后我一一的运行了一遍,判断结果和预想当中的是一样的,至于如果赋值为null,是不能调用方法的,会报java程序员经常看见的一个异常,空指针,不赘述。

最开始想到的是这是不是scala算是脚本语言,是不是和大部分脚本语言实现机制一样,比如最常见的js,最后看到小结之时才明白并不是如此,而是scala会先去判断null,然后才会调用java的equals方法。

小结如下:

 

 

3、 创建多个字符串

 

 

说明:为什么这个例子我需要截图,原因后续说明

接下来看几段代码:

val foo ="""This is a muitiline String"""
val foo1 =
"""This is
  | a muitiline
  | String""".stripMargin

至于变量foo1是怎么来的呢,书籍当中因为是命令行的方式,就讲到需要用到stripMargin方法以及默认”|”的使用,但实际上ide没有这么复杂,直接在对应字符敲回车就是,比如你要从is隔断,就在is处回车就好,就会自动生成相应代码,但是如果不加”|”以及stripMargin会怎样呢,看下执行结果:

 


就会不左对齐,一眼就明白.

然后说说自定义:

val foo2 =
  """This is
    # a muitiline
    # String""".stripMargin('#')

很明显符号是可以自定义的,不光可以使用”|”,还可以在方法当中自定义为”#”,附stripMargin api(idea快捷键:ctrl+q)

 


猜你喜欢

转载自endless2009.iteye.com/blog/2361663