1. 程式人生 > >Scala(一)之“字串”

Scala(一)之“字串”

    Scala中的String類就是Java的String類,所以可以直接呼叫Java裡String的所有方法。
  • 檢視字串的型別
scala> "Hello, world".getClass.getName
res1: String = java.lang.String
  • 獲取字串長度
scala> val s = "Hello, world"
s: String = Hello, world
scala> s.length
res2: Int = 12
  • 連線字串
scala> val s = "Hello" + " world"
s: String = Hello world scala> s res4: String = Hello world
  • 把String當作字元序列來處理,可以通過foreach方法遍歷字串中的每個字元。
scala> "Hello".foreach(println)
H
e
l
l
o
  • 可以通過for迴圈把字串當做字元序列來處理
scala> for(c <- "hello") println(c)
h
e
l
l
o
  • 可以將字串當做位元組序列
scala> s.getBytes.foreach(println)
72
101
108
108 111 32 119 111 114 108 100
  • 字串還可以使用filter這樣的函式式方法
scala> val result = "hello world".filter(_ != '1')
result: String = hello world
  • Scala擁有String和Collection中的功能
// drop(n)方法是從集合頭部開始,丟棄n個元素,並保留剩餘元素的集合方法
scala> "scala".drop(2)  
res8: String = ala
// take(n)方法會保留所給集合的頭n個元素,然後丟棄剩餘的部分
scala> res8.take
(2) res9: String = al scala> res9.capitalize res10: String = Al
  • 測試字串相等
    Scala中提供==操作符來比較兩個字串的例項
scala> val s1 = "Hello"
s1: String = Hello

scala> val s2 = "Hello"
s2: String = Hello

scala> val s3 = "H" + "ello"
s3: String = Hello

scala> s1 == s2
res11: Boolean = true

scala> s1 == s3
res12: Boolean = true

scala> s1 == s3

使用==,當字串是null是也不會丟擲NullPointerException

scala> val s4: String = null
s4: String = null

scala> s3 == s4
res14: Boolean = false

如果比較兩個字串時,不考慮字元大小寫問題,可以直接將字串先轉成全部大寫或者全部小寫,然後使用==方法

scala> val s1 = "hello"
s1: String = hello

scala> val s2 = "hello"
s2: String = hello

scala> s1.toUpperCase == s2.toUpperCase
res16: Boolean = true

也可以忽略大小寫比較兩個字串

scala> val a = "Marisa"
a: String = Marisa

scala> val b = "marisa"
b: String = marisa

scala> a.equalsIgnoreCase(b)
res17: Boolean = true
  • 在Scala中,可以用三個雙引號建立多行的字串
scala> val foo = """This is 
     | a multiline
     | String"""
foo: String =
This is
a multiline
String

scala> foo
res18: String =
This is
a multiline
String

使用如下方法左對齊第一行之後的每一行

scala> val speech = """Four score and
     | |seven years age""".stripMargin
speech: String =
Four score and
seven years age

也可以自定義上面程式碼中的管道符,如下:

scala> val speech = """Four score and
     | #seven years ago""".stripMargin('#')
speech: String =
Four score and
seven years ago

scala> speech
res19: String =
Four score and
seven years ago

將多個字串轉換成一個連續的行

scala> val speech = """Four score and
     | |seven years ago
     | |our fathers""".stripMargin.replace("\n", " ")
speech: String = Four score and seven years ago our fathers

scala> speech
res20: String = Four score and seven years ago our fathers

Scala中多行字串可以包括單引號和雙引號,無需對其進行轉意

scala> val s = """This is know as a
     | |"multline" string
     | |or 'heredoc' syntax.""".stripMargin.replace("\n", " ")
s: String = This is know as a "multline" string or 'heredoc' syntax.

scala> s
res21: String = This is know as a "multline" string or 'heredoc' syntax.
  • 分割字串,使用String物件中的split()方法,作用的結果是產生一個以字串為元素的一個數組
scala> "hello world".split(" ")
res22: Array[String] = Array(hello, world)

scala> "hello world".split(" ").foreach(println)
hello
world

scala> val s = "eggs,milk,butter,Coco Puffs"
s: String = eggs,milk,butter,Coco Puffs

scala> s.split(",")
res25: Array[String] = Array(eggs, milk, butter, Coco Puffs)

scala> s.split(",").map(_.trim)
res27: Array[String] = Array(eggs, milk, butter, Coco Puffs)
// 使用正則表示式空格分割一個字串
scala> "hello world, this is Al".split("\\s+")
res29: Array[String] = Array(hello, world,, this, is, Al)
  • 字串中的變數替換,Scala中基礎的字串插值就是在字串前加字幕‘s’,然後在字串中放入變數,每個變數都應以‘$’開頭。字串前加字母‘s’時,其實是在建立一個處理字串字面量
scala> val name = "GnahzNib"
name: String = GnahzNib

scala> val age = 33
age: Int = 33

scala> val weight = 140.0
weight: Double = 140.0

scala> println(s"$name is $age years old, and weights $weight pounds.")
GnahzNib is 33 years old, and weights 140.0 pounds.

在字串字面量中使用表示式,“${}內可嵌入任何表示式”,包括等號表示式。

scala> println(s"Age next year: ${age + 1}")
Age next year: 34

scala> println(s"You are 33 years old:${age == 33}")
You are 33 years old:true

注意,在列印物件欄位時使用花括號。

scala> case class Student(name: String, score: Int)
defined class Student

scala> val hannah = Student("Hannah", 95)
hannah: Student = Student(Hannah,95)

scala> println(s"${hannah.name} has a score of ${hannah.score}")
Hannah has a score of 95

字串差值f(printf格式化)

scala> println(f"$name is $age years old, and weighs $weight%.2f pounds.")
GnahzNib is 33 years old, and weighs 140.00 pounds.

scala> printf(f"$name is $age years old, and weighs $weight%.2f pounds.")
GnahzNib is 33 years old, and weighs 140.00 pounds.

其他插入符

scala> s"gnahz\nnib"
res36: String =
gnahz
nib
  • 挨個處理字串中的字元
    原始的String呼叫filter方法,建立一個新的字串,生成的字串呼叫map方法,遍歷其每個字元。
scala> val upper = "hello, world".filter(_!='l').map(_.toUpper)
upper: String = HEO, WORD

跟map函式等價的for/yield迴圈的表示如下:

scala> val upper = for(c <- "hello, world") yield c.toUpper
upper: String = HELLO, WORLD

在for迴圈新增yield實際上是將每次迴圈的結果放到了一個臨時存放區中,當迴圈結束時,在臨時存放區中的所有元素以一個集合的形式返回。

scala> val result = for{
     | c <- "hello, world"
     | if c != 'l'
     | }yield c.toUpper
result: String = HEO, WORD

總結:
map方法或者是for/yield都是將一個集合轉換成為另一個新的集合,foreach則是典型的對每個元素進行操作但不返回結果的方法。

  • 字串中的查詢模式
    在一個String上呼叫.r方法可以建立一個Regex物件,之後再查詢是否含有一個匹配時就可以用findFirstIn,當需要查詢是否完全匹配時可以用findAllIn。
// 匹配一個或多個數字序列
scala> val numPatter = "[0-9]+".r
numPatter: scala.util.matching.Regex = [0-9]+

scala> val address = "123 Main Street Suite 101"
address: String = 123 Main Street Suite 101

scala> val match1 = numPatter.findFirstIn(address)
match1: Option[String] = Some(123)

scala> val match1 = numPatter.findAllIn(address)
match1: scala.util.matching.Regex.MatchIterator = non-empty iterator

scala> match1.foreach(println)
123
101
  • 字串中的替換模式
    用正則表示式匹配一段字串,然後替換它們。因為String是不可變的,不可以在它上面直接查詢然後替換,但是可以建立一個新的String,而這個新的String包含了替換後的內容。
    在一個String上呼叫replaceAll,要給結果賦一個新的變數
scala> val address = "123 Main Street".replaceAll("[0-9]", "x")
address: String = xxx Main Street

可以建立一個正則表示式,然後在正則表示式上呼叫replaceAllIn方法,要給結果賦一個新值。

scala> val regex = "[0-9]".r
regex: scala.util.matching.Regex = [0-9]

scala> val newAddress = regex.replaceAllIn("123 Main Street", "x")
newAddress: String = xxx Main Street
  • 抽取String中模式匹配的部分
    抽取一個或者多個在字串中的正則匹配到的部分,定義想要抽取的正則表示式,在它們周圍加上括號這樣就可以將其當做“正則表示式組”來使用
scala> val pattern = "([0-9]+) ([A-Za-z]+)".r
pattern: scala.util.matching.Regex = ([0-9]+) ([A-Za-z]+)

scala> val pattern(count, fruit) = "100 Bananas"
count: String = 100
fruit: String = Bananas
  • 訪問字串中的一個字元
    得到字串中指定位置的一個字元。
scala> "hello".charAt(0)
res43: Char = h
// Scala的Array符號
scala> "hello"(0)
res44: Char = h
  • String中新增自定義的方法
    定義一個隱式轉換的類,然後在這個類中定義一些方法,來實現期望的行為。
scala> implicit class StringImprovements(s: String){
     | def increment = s.map(c => (c + 1).toChar)
     | }
defined class StringImprovements

scala> val result = "HAL".increment
result: String = IBM

相關推薦

Scala字串

Scala中的String類就是Java的String類,所以可以直接呼叫Java裡String的所有方法。 檢視字串的型別 scala> "Hello, world".getClass.getName res1: String

大資料scala --- 安裝scala,簡單語法介紹,條件表示式,輸入和輸出,迴圈,函式,過程,lazy ,異常,陣列

一、安裝和執行Scala解釋程式 --------------------------------------------- 1.下載scala-2.11.7.msi 2.管理員執行--安裝 3.進入scala/bin,找到scala.bat,管理員執行,進入scala命

地址映象和變換主存虛存

規則 根據 pan 命中率 實現 -s tro 分享 使用 地址映象:是將每一個虛存單元按某種規則裝入實存,即建立多用戶虛地址與實存地址之間的相應關系。 地址變換:是程序依照這樣的映象關系裝入實存後。在運行時,多用戶虛地址怎樣變換成相應的實存地址。 頁面爭用(實頁沖突

web框架基礎簡介

-a 程序 我想 pos 客戶 創建 當前 自動 art http的請求聲明周期:域名----DNS服務器---IP地址---基於tcp協議的http協議發送請求協議,服務端返回響應頭+響應體(我們所看到的頁面(是經過js渲染的,接收的是字符串))服務端(web服務)根據我

數據庫中間件 Sharding-JDBC 源碼分析 —— SQL 解析語法解析

sharding-jdbc關註微信公眾號:【芋艿的後端小屋】有福利:RocketMQ / MyCAT / Sharding-JDBC 所有源碼分析文章列表RocketMQ / MyCAT / Sharding-JDBC 中文註釋源碼 GitHub 地址您對於源碼的疑問每條留言都將得到認真回復。甚至不知道如何讀

Linux I2C常用的幾種實例化(i2c_client ) 【轉】

掃描 sent near 通過 完成 check 根據 pup views 轉自:http://blog.csdn.net/lugandong/article/details/48092397 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)

數據結構鏈表

存儲 鏈表操作 author void 復雜 pac 部分 地址 插入 一、鏈表   鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。   鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個

tensorflow筆記基礎知識

輸入 gpu oat baidu nump 通過 img ubuntu下 能力 tensorflow筆記(一)之基礎知識 版權聲明:本文為博主原創文章,轉載請指明轉載地址 http://www.cnblogs.com/fydeblog/p/7399701.html 前言

JDBC細說JDBC

這一 操作 對應關系 rep throw tco 接口 nag cep Properties info = new Properties();//要參考數據庫文檔 info.setProperty("user", "root"); i

scala方法&函數

沒有 閉包 spark 過程 partition 需求 bean 才會 amp 寫在前面 眾所周知,scala一向宣稱自己是面向函數的編程,(java表示不服,我是面向bean的編程!)那什麽是函數? 在接觸java的時候,有時候用函數來稱呼某個method(實在找不出

java學習——java基礎概念解析

userinfo shuf cdn pdm shu href ember sig lower 鵲拙崩系06凳q毫乙6http://docstore.docin.com/sina_6341933819 6j50uk佬詼4wn刮掖http://shequ.docin.com/

TCP/IP開啟計算機網絡

廣域網 概述 pic .cn 慢慢 internet 通信 hub album 前言 在一段時間裏,都很想知道一臺電腦怎麽跟另一臺電腦通信的,我發送一個qq給女朋友,怎麽準確的發送過去的,又是怎麽接受消息的。 接下來一段時間給大家慢慢分享關於計算機網絡的相關知識。 一、局域

JavaWeb細說Servlet

troy 文件名 ngs 很多 generics 頁面 虛擬 ats att 前言   其實javaWeb的知識早就學過了,可是因為現在在搞大數據開發,所以web的知識都忘記了。準備開始慢慢的把Web的知識一點一點的回憶起來,多學一點沒有關系,就怕到時候要用的話,什麽都不

CentOS7 +vsftpd 匿名

網絡設備 scripts /usr yml list packet 如果 sting cmp CentOS7 +vsftpd (一)之 匿名 ftp的搭建是一個基礎性的工作,CentOS7 +vsftpd 是一個比較容易實現的平臺,但在搭建中問題會不少,本系列將通過四篇隨筆

Hadoop初識大數據與Hadoop

hive 程序員 http 關系型數據庫 .com 邏輯 使用 alt clu 前言   從今天起,我將一步一步的分享大數據相關的知識,其實很多程序員感覺大數據很難學,其實並不是你想象的這樣,只要自己想學,還有什麽難得呢?   學習Hadoop有一個8020原則,80%

Pyhton編程第一個Pyhton程序

第一個 ext 二進制 col 執行 can chm 交換 產生 一:Python的第一個程序   Python在Windows系統和Linux系統下都可以安裝,這裏不過多說明安裝過程,linux系統默認情況已經安裝了Python2x的版本。註:目前使用的Python均為3

Hadoop初識大數據與Hadoop【轉載】

hba 無效 理解 組織 鼠標 掌握 能夠 through 2.3 原文地址:http://www.cnblogs.com/zhangyinhua/p/7647334.html 閱讀目錄(Content) 一、引言(大數據時代) 1.1、從數據中得到信息 1.2、大數據

Struts2+Spring+Hibernate實現員工管理增刪改查功能ssh框架整合

pri support scrip ext ack efault ring src 兩張 前言 轉載請標明出處:http://www.cnblogs.com/smfx1314/p/7795837.html 本項目是我寫的一個練習,目的是回顧ssh框架的整合以及

Jest 學習筆記matchers

react 使用 babel 不能 文件夾 fin 控制 -- scripts   Jest官網地址: https://facebook.github.io/jest/     Jest是專門被facebook用於測試包括React應用在內的所有javascript代碼,J

Pyhton函數篇函數中的形參與實參

依然 tell 多個 存在 默認 urn 字符串 div 地址 1:什麽是函數   函數其實就是帶名字的代碼塊,用於完成一些具體的工作。如果我們在寫一段程序的時候,需要多次用到同樣的一個功能,如果每次都要重復寫相同的代碼,不僅會增加我們的代碼量,更會讓我們寫出的代碼讓別人看