Scala遍历字符串并对字符做操作

Scala中可以使用map、foreach方法、for循环等多种方式遍历字符串,但是map应该是使用比较方便,比较多的,eg.

    val upper = "Hello, Scala"
    println(upper.map(_.toUpper))
    println(upper.map(x => x.toUpper))

输出如下:

HELLO, SCALA
HELLO, SCALA

对于任何集合,如一个字符串中的一个字符序列也可以通过将集合方法连起来使用来达到目的。比方说在原始的String上面调用filter方法,创建一个新的字符串,删除字母“L”的所有小写字符。生成的字符调用map方法,便利其每个字符并将它们变成大写,eg.

    println(upper.filter(_ != "l").map(_.toUpper))
    println(upper.filter(_ != 'l').map(_.toUpper))

输出如下:

HELLO, SCALA
HEO, SCAA

使用for循环也可以达到遍历字符串的目的,eg.

for(c <- upper) println(c)

输出结果如下:

H
e
l
l
o
,
 
S
c
a
l
a

为了用for循环写出一个用起来像map的方法,在循环的结尾处加一个yield语句。eg.

println(for(c <- upper) yield  c.toUpper)

输出如下:

HELLO, SCALA

在for循环中添加yield实际上是将每次循环的结果放到了一个临时存放区中。当循环结束时,在临时存放区中的所有元素以一个集合的形式返回。

println(for(c <- upper if c != 'l') yield  c.toUpper)

输出如下:

HEO, SCAA

然而map方法或者for/yield这种方式都是将一个集合转换成为另一个新的集合,foreach则是典型的对每个元素进行操作但不返回结果的方法。对于打印来说这个很有用,eg:

upper.foreach(println)

输出如下:

H
e
l
l
o
,
 
S
c
a
l
a

理解map如何工作的

根据功能需要,可以给map方法传一个大的代码块。eg.

println(upper.map{c => (c.toByte + 1).toChar})

输出如下:

Ifmmp-!Tdbmb

map方法有一个隐式循环,在这个循环里,每次都会给算法传一个字符。具体mapTraversableLike.scala中的源码如下:

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
    def builder = { // extracted to keep method size under 35 bytes, so that it can be JIT-inlined
      val b = bf(repr)
      b.sizeHint(this)
      b
    }
    val b = builder
    for (x <- this) b += f(x)
    b.result
  }

注意到算法每次只操作一个字符。这是因为本例中的map方法是在String上调用的,所以map把String当做一个字符元素的序列集合来处理。为了保持代码整洁,可以把算法写成一个方法或者函数,这样就可以直接传给map了;eg.

val toLower = (c:Char) => (c.toByte + 32).toChar
    println("HELLO".map(toLower))

输出如下:

hello

for/yield语法也可以达到同样的效果,eg.

println(for (c <- "HELLO") yield toLower(c))
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,092评论 19 139
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 8,475评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,238评论 18 399
  • 在一个满天繁星的夜晚,我把仪式的构架抬到了草地上 我躺在草地上,仪式的构架在我近旁 我以为满天繁星会照亮我的身子,...
    那个叫乌鸦的少年阅读 2,778评论 0 2
  • 我们生活中肯定会遇到自己非常难受的事情,可能每个人对于难受的事情定义不一样,有的人认为没有自由非常难受,有的认为体...
    善行无痕阅读 3,395评论 2 1

友情链接更多精彩内容