《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)
下一篇: Javascript字符串