`
三个诸葛亮
  • 浏览: 17630 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《scala编程实战》读书笔记------分隔字符串和字符串变量替换

    博客分类:
  • Java
 
阅读更多

一、 分隔字符串

        说起分隔字符串我想各位大虾应该都不陌生,数据库操作很多会拼接”,”,”|”类似的很多字符,当然同理也会有很多解的方式,java当中常用的方法就是split。So,应该我猜到我要说的是什么了吧,scala当然也是split,但是scala有自己出彩的地方。接下来容我一一道来。

        首先来一道开胃菜:

 

"hello world".split(" ").foreach(print)

 

 

        很简单吧,以” ”(空格)分隔之后循环打印每个字符串,这看起来也没啥特别的,即使函数式也在之前的博客当中见到不少。接着往下说。

        依旧,从代码说起:

 

"eggs, milk, butter, Coco Puffs".split(",").foreach(print)
"eggs, milk, butter, Coco Puffs".split(",").map(_.trim).foreach(print)
"eggs, milk, butter, Coco Puffs".split("\\s+").map(_.trim).foreach(print)
"eggs, milk, butter, Coco Puffs".split(',').map(_.trim).foreach(print)

               

 

        也许,猛一看,第二句代码好像和第四句代码是一样的,但实际上确不一样,为什么这么说呢,仔细观察split里面的字符串,发觉了吧,一个是双引号,一个是单引号,但他俩有什么本质区别?开始我看到此处的时候也不太明白,当然书籍后面也说明白了,来自于何处,但是即使这样没有直观感受也许说明不了问题,因此,来上一段源码。

 

/** Split this string around the separator character
 *
 * If this string is the empty string, returns an array of strings
 * that contains a single empty string.
 *
 * If this string is not the empty string, returns an array containing
 * the substrings terminated by the start of the string, the end of the
 * string or the separator character, excluding empty trailing substrings
 *
 * If the separator character is a surrogate character, only split on
 * matching surrogate characters if they are not part of a surrogate pair
 *
 * The behaviour follows, and is implemented in terms of <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29">String.split(re: String)</a>
 *
 *
 * @example {{{
 * "a.b".split('.') //returns Array("a", "b")
 *
 * //splitting the empty string always returns the array with a single
 * //empty string
 * "".split('.') //returns Array("")
 *
 * //only trailing empty substrings are removed
 * "a.".split('.') //returns Array("a")
 * ".a.".split('.') //returns Array("", "a")
 * "..a..".split('.') //returns Array("", "", "a")
 *
 * //all parts are empty and trailing
 * ".".split('.') //returns Array()
 * "..".split('.') //returns Array()
 *
 * //surrogate pairs
 * val high = 0xD852.toChar
 * val low = 0xDF62.toChar
 * val highstring = high.toString
 * val lowstring = low.toString
 *
 * //well-formed surrogate pairs are not split
 * val highlow = highstring + lowstring
 * highlow.split(high) //returns Array(highlow)
 *
 * //bare surrogate characters are split
 * val bare = "_" + highstring + "_"
 * bare.split(high) //returns Array("_", "_")
 *
 *  }}}
 *
 * @param separator the character used as a delimiter
 */
def split(separator: Char): Array[String] =
  toString.split(escape(separator))

 

 

        接着回到原点,从4句代码说起,说明2处特别之处:1、为什么没有foreach,而用map(_.xxx)的方式,scala很特别,提供了占位符的方式,至于map是内部迭代的方式就不多做阐述;2、源码来自StringLike类,通过ctrl+q(idea快捷键)或者ctrl+左键查看源码不仅可以看到详细的说明,还有e.g,是不是感觉阅读起来就没那么复杂了。

 

二、字符串中的变量代换

        书籍开篇就说到像Perl、PHP、Ruby一样,但是对于来说就是这样的感觉,根本没学过这些语言,是不是一样与我无关。但是有一点很像的是啥呢,像python、spring的SPEL,这才是我的真实感受(这是学完之后的感受),当然SPEL强大很多,毕竟不能和框架比,框架扩展的东西太多,也许你觉得学得差不多的时候,其实才摸到一点皮毛一样的感觉一样,就像spring的各种领域一样,这点可以在spring.io当中去看docs的时候感受到。

        回到主题,一道开胃菜:

 

val name = "Fred"
val age=33
val weight = 200
println(s"$name is $age years old,and weighs $weight pounds.")

 

 

        学东西就从基础开始不是?这本书的架构也基本就是这样,从易到难。

        打印结果可能各位已经猜出: Fred is 33 years old,and weighs 200 pounds.

        字符串变量代换好像也就如此,其实还真是就是如此,并没什么特别的地方,和python很像,和SPEL很像吧!

        接着来几个特殊的例子感受一下就行了,估计在实际用的时候这是个鸡肋的东西,基本用不到。

        表达式计算:

Param同上,不再列出:

 

println(s"Age next year:${age+1}")
println(s"You are 33 years old:${age==33}")

 

 

 

打印结果: 

Age next year:34

You are 33 years old:true

 

对象变量:

 

case class Student(name:String,score:Int)
val hannah = Student("Hannah",95)
println(s"${hannah.name} has a score of ${hannah.score}")

 

 

 

接着,还来一个format的用法:

 

println(f"$name is $age years old,and weighs $weight%.2f pounds.")

 

 

当然这点和其他的语言一样,其实”s”和”f”都是方法,如果有需求自己就能实现,scala还支持自定义,所以个人觉得这个不是很特别的一小节。

最后,贴一下printf格式化常用符:

格式化符号 描述
%c 字符
%d 十进制数字
%e 指数浮点数
%f 浮点数
%i 整数(十进制)
%o 八进制数
%s 字符串
%u 无符号十进制数
%x 十六进制数
%% 打印一个百分号
\% 打印一个百分号

 

 

0
0
分享到:
评论

相关推荐

    scala-intellij-bin-2016.3.9

    总的来说,"scala-intellij-bin-2016.3.9"插件是Scala开发者在IntelliJ IDEA中高效工作的重要工具,它通过丰富的特性集和与IDE的紧密集成,使得Scala编程变得更加顺畅和愉快。如果你是Scala的爱好者或者正在从事...

    scala-xml_2.12-1.0.6-API文档-中文版.zip

    赠送jar包:scala-xml_2.12-1.0.6.jar; 赠送原API文档:scala-xml_2.12-1.0.6-javadoc.jar; 赠送源代码:scala-xml_2.12-1.0.6-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.12-1.0.6.pom; 包含翻译后的API...

    scala-intellij-bin-2016.3.1.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。IntelliJ IDEA是一款非常流行的集成开发环境(IDE),尤其受到Java和Scala开发者喜爱。在本压缩包"scala-intellij-bin-2016.3.1.zip"中,...

    scala-intellij-bin-2020.2.3.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。IntelliJ IDEA是一款著名的集成开发环境(IDE),广泛用于Java、Scala和其他 JVM 语言的开发。"scala-intellij-bin-2020.2.3.zip" 是一个...

    scala插件 scala-intellij-bin-2018.3.5.zip scala-intellij-bin-2018.3.6.zip

    Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特点,为开发者提供了丰富的表达能力和灵活性。在Java虚拟机(JVM)上运行的Scala,因其高效性和与Java的无缝集成,成为了开发大规模分布式计算...

    scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz

    scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz

    scala-intellij-bin-2017.2.13

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。IntelliJ IDEA是一款广受赞誉的Java集成开发环境(IDE),它为开发者提供了丰富的工具和功能来提升开发效率。"Scala-intellij-bin-2017.2.13...

    scala-intellij-bin-0.41

    Scala是一种强大的多范式编程语言,它融合了函数式编程和面向对象编程的特点。IntelliJ IDEA是一款广受赞誉的Java开发集成环境,为开发者提供了高效、智能的代码编写体验。"scala-intellij-bin-0.41"是专门为...

    scala-intellij-bin-2019.1.2.zip

    Scala是一种强大的多范式编程语言,它融合了函数式编程和面向对象编程的特点。IntelliJ IDEA是一款广受开发者喜爱的集成开发环境(IDE),它提供了丰富的功能来支持各种编程语言,包括Scala。"scala-intellij-bin-...

    scala-intellij-bin-2018.3.2.zip

    scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!

    scala-intellij-bin-2021.1.22.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。IntelliJ IDEA是一款广受欢迎的Java开发集成环境,同时也为多种其他语言提供了支持,包括Scala。"scala-intellij-bin-2021.1.22.zip" 是一个...

    scala-intellij-bin-2017.2.6

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。IntelliJ IDEA是一款广受欢迎的集成开发环境(IDE),尤其在Java和Scala开发者中非常流行。"scala-intellij-bin-2017.2.6" 是一个特定版本的...

    flink-scala_2.12-1.14.3-API文档-中文版.zip

    赠送jar包:flink-scala_2.12-1.14.3.jar 赠送原API文档:flink-scala_2.12-1.14.3-javadoc.jar 赠送源代码:flink-scala_2.12-1.14.3-sources.jar 包含翻译后的API文档:flink-scala_2.12-1.14.3-javadoc-API...

    scala-compiler-2.11.8-API文档-中英对照版.zip

    赠送jar包:scala-compiler-2.11.8.jar; 赠送原API文档:scala-compiler-2.11.8-javadoc.jar; 赠送源代码:scala-compiler-2.11.8-sources.jar; 赠送Maven依赖信息文件:scala-compiler-2.11.8.pom; 包含翻译后...

    scala-intellij-bin-2021.3.6.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。IntelliJ IDEA是一款广受欢迎的集成开发环境(IDE),尤其在Java和Scala开发者中有着极高的赞誉。"scala-intellij-bin-2021.3.6.zip"是一个...

    scala-SDK-4.7.0-vfinal-2.12-win32.win32.x86_64

    - **类型推断增强**:编译器能够更准确地推断变量和方法的类型,减少了需要显式类型的代码。 - **更好的互操作性**:Scala 2.12改进了与Java代码的互操作性,使混合编程更加平滑。 在Windows环境下,开发者可以利用...

    scala-ide-plugin-eclipse

    scala eclipse插件.对应scala版本:2.10--2.11,对应eclipes版本:4.4--4.5. update site:http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site 下载地址:...

    scala-reflect-2.11.8-API文档-中英对照版.zip

    赠送jar包:scala-reflect-2.11.8.jar; 赠送原API文档:scala-reflect-2.11.8-javadoc.jar; 赠送源代码:scala-reflect-2.11.8-sources.jar; 赠送Maven依赖信息文件:scala-reflect-2.11.8.pom; 包含翻译后的API...

    scala-compiler-2.12.7-API文档-中文版.zip

    赠送jar包:scala-compiler-2.12.7.jar; 赠送原API文档:scala-compiler-2.12.7-javadoc.jar; 赠送源代码:scala-compiler-2.12.7-sources.jar; 赠送Maven依赖信息文件:scala-compiler-2.12.7.pom; 包含翻译后...

    scala-intellij-bin-2019.2.28.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。IntelliJ IDEA是一款广受欢迎的集成开发环境(IDE),尤其在Java开发者中备受推崇。它提供了丰富的功能来支持各种编程语言,包括Scala。`...

Global site tag (gtag.js) - Google Analytics