官术网_书友最值得收藏!

2.12 創(chuàng)建隨機(jī)字符串

問題

當(dāng)你使用Random類的nextString方法生成一個(gè)隨機(jī)字符串時(shí),會(huì)看到很多不尋常的輸出或?字符。一個(gè)典型的例子是這樣的:

解決方案

nextString返回Unicode字符,而這些字符在你的系統(tǒng)上可能顯示得很好,也可能不顯示。要想只生成字母數(shù)字字符,即字母[A-Za-z]和數(shù)字[0-9],請(qǐng)使用下面的方式:

Random.alphanumeric返回一個(gè)LazyList,所以這里使用take(10).mkString來獲取流中的前10個(gè)字符。如果只調(diào)用Random.alphanumeric.take(10),會(huì)得到這個(gè)結(jié)果:

因?yàn)長azyList是惰性的——它只在需要的時(shí)候才會(huì)被計(jì)算——所以必須調(diào)用像mkString這樣的方法來對(duì)其求值。

討論

根據(jù)Random類文檔(https://oreil.ly/syhlb),alphanumeric“返回一個(gè)從A~Z、a~z和0~9中平均選擇的偽隨機(jī)的LazyList”。

如果想要一個(gè)更廣范圍的字符,nextPrintableChar方法會(huì)返回ASCII字符,其ASCII碼的范圍是33~126。這包括鍵盤上幾乎所有的簡單字符,包括字母、數(shù)字和像!、-、+、]和>這樣的字符。例如,這里有一個(gè)小算法,可以生成一個(gè)隨機(jī)長度的可輸出字符序列:

下面是該算法所產(chǎn)生的隨機(jī)序列的幾個(gè)例子:

這些可以用mkString轉(zhuǎn)換為一個(gè)字符串,如下所示:

請(qǐng)參閱https://www.asciitable.com/或類似網(wǎng)站,了解ASCII碼范圍為33~126的完整字符列表。

惰性方法

正如20.1節(jié)中所描述的,在Apache Spark中,可以把集合方法看成是轉(zhuǎn)換(transformation)方法或動(dòng)作(action)方法:

·轉(zhuǎn)換方法可以轉(zhuǎn)換一個(gè)集合中的元素。對(duì)于像List、Vector和LazyList這樣的不可變的類,這些方法會(huì)對(duì)現(xiàn)有的元素進(jìn)行轉(zhuǎn)換,從而創(chuàng)建一個(gè)新的集合。就像Spark一樣,當(dāng)你使用Scala的LazyList時(shí),這些方法被惰性求值(也稱為惰性或非嚴(yán)格求值)。像map、filter、take等方法都被認(rèn)為是轉(zhuǎn)換方法。

·動(dòng)作方法是本質(zhì)上是強(qiáng)制求值的方法。它們是一種聲明“我現(xiàn)在就要這個(gè)結(jié)果”的方式。像foreach和mkString這樣的方法可以被認(rèn)為是動(dòng)作方法。

請(qǐng)參閱11.1節(jié)以了解更多關(guān)于轉(zhuǎn)換方法的討論和例子。

另見

·在我的博客“How to Create Random Strings in Scala(A Few Different Examples)”(https://oreil.ly/PEijH)中,展示了7種不同生成隨機(jī)字符串的方法,包括純字母和字母數(shù)字字符串。

·在“Scala:A Function to Generate a Random-Length String with Blank Spaces”(https://oreil.ly/LtUy4)中,展示了如何生成一個(gè)包含空格的隨機(jī)長度的隨機(jī)字符串。

主站蜘蛛池模板: 灵璧县| 宜宾县| 陆丰市| 清河县| 桐乡市| 昆山市| 丹阳市| 建湖县| 崇义县| 莆田市| 遂川县| 乌兰察布市| 石渠县| 大姚县| 岳普湖县| 嘉义县| 宁明县| 偃师市| 双桥区| 枣阳市| 杭州市| 奈曼旗| 红原县| 长子县| 美姑县| 宝清县| 湟源县| 微山县| 通渭县| 安庆市| 思南县| 霸州市| 利辛县| 化德县| 瑞安市| 湘潭县| 安义县| 乌拉特中旗| 新干县| 茂名市| 镇安县|