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:什麽是函數 函數其實就是帶名字的代碼塊,用於完成一些具體的工作。如果我們在寫一段程序的時候,需要多次用到同樣的一個功能,如果每次都要重復寫相同的代碼,不僅會增加我們的代碼量,更會讓我們寫出的代碼讓別人看