酷炫的一行代碼 - Scala就是這么任性!

得益于Scala優(yōu)雅的設(shè)計(jì),很多常見(jiàn)的功能都可以用一行代碼實(shí)現(xiàn),簡(jiǎn)潔的同時(shí)不乏表現(xiàn)力,就算你不熟悉Scala,通過(guò)代碼你也能大致猜出它的含義,這也從一個(gè)側(cè)面說(shuō)明Scala是一門強(qiáng)大的編程語(yǔ)言。

過(guò)濾出序列中所有偶數(shù)

filter方法會(huì)將序列中各個(gè)元素依次替換到下劃線"_"所處位置,如果返回true,則保留該元素。

(1 to 9).filter( _ % 2 == 0 )

輸出:2, 4, 6, 8

對(duì)序列中所有元素求和

reduceLeft是一個(gè)通用的聚集計(jì)算方法,你可以把"+"換成其它的運(yùn)算。其實(shí)對(duì)于求和有更簡(jiǎn)單的方法,請(qǐng)參考第6條。

(1 to 9).reduceLeft(_ + _)

輸出:45

統(tǒng)計(jì)單詞出現(xiàn)次數(shù)

groupBy方法可以將序列轉(zhuǎn)換成Map,適合用在需要按某個(gè)屬性進(jìn)行統(tǒng)計(jì)的情況。

List("no", "zuo", "no", "die").groupBy(w => w).mapValues(_.length)

輸出:Map(no -> 2, zuo -> 1, die -> 1)

將序列中單詞首字母大寫(xiě)

map可以把序列轉(zhuǎn)換成另一個(gè)序列,在map方法中定義各個(gè)元素的轉(zhuǎn)換過(guò)程。

List("one", "line", "of", "code").map(_.capitalize)

輸出:List(One, Line, Of, Code)

將序列拼接成字符串

mkString方法用于將序列拼接成字符串,第1個(gè)參數(shù)是起始符號(hào),第2個(gè)參數(shù)是分隔符,第3個(gè)參數(shù)是結(jié)束符號(hào)。

(1 to 9).mkString("(", ",", ")")

輸出:(1,2,3,4,5,6,7,8,9)

最大值,最小值和求和

這在Scala中輕而易舉,直接調(diào)用min,max和sum方法。

List(14, 35, -7, 46, 98).min 
List(14, 35, -7, 46, 98).max 
List(14, 35, -7, 46, 98).sum

輸出:-7 98 186

獲取序列中最大的前3個(gè)數(shù)值和位置

zipWithIndex方法將序列List[Int]轉(zhuǎn)換成List[(Int, Int)],即List[Tuple2[Int, Int]]。Tuple2的第1個(gè)Int是元素,第2個(gè)Int是元素所處的位置。

List(2, 0, 1, 4, 12, 5).zipWithIndex.sorted.reverse.take(3)

輸出:List((12,4), (5,5), (4,3))

讀取文本文件

在Scala中讀取文本文件相當(dāng)輕松。

val fileContent = io.Source.fromFile("myfile.txt").mkString
val fileLines = io.Source.fromFile("myfile.txt").getLines.toList

下載URL鏈接

下載文件就是這么容易。其實(shí)利用sys.process包,我們可以用Scala編寫(xiě)Shell腳本,是不是很酷!

import sys.process._
import java.net.URL
import java.io.File
new URL("http://www.oschina.net/favicon.ico") #> new File("d:/favicon.ico") !!

并行計(jì)算

par方法將原序列轉(zhuǎn)換成并行序列,可以利用多核的優(yōu)勢(shì)加快處理速度,真是想得太周到了!

(1 to 99).par.sum

兩個(gè)List相乘求和

類似加權(quán)求和。

dataList.zip(weightList).map{t => t._1 * t._2}.sum

按多個(gè)字段排序List

先按學(xué)生的年齡排序,如果年齡相同,則按分?jǐn)?shù)排序:

    case class Student(name: String, age: Int, score: Int)
    List(
      Student("a", 14, 60), 
      Student("b", 15, 80), 
      Student("a", 15, 70)
    ).sortBy(s => (s.age, s.score))

輸出:List(Student(a,14,60), Student(a,15,70), Student(b,15,80))

將List相鄰元素分組

每相鄰的10個(gè)元素分成一組:

val list = (0 to 20).map(_.toString)
list.zipWithIndex.map(t => t._1 -> ((t._2 / 10) * 10)).groupBy(_._2).toList.sortBy(_._1).map(_._2.map(_._1))

輸出:
Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
Vector(10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
Vector(20)

取序列的第1個(gè)元素

其中包含了判空邏輯。

List(1, 2, 3).headOption.getOrElse(0)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Scala的集合類可以從三個(gè)維度進(jìn)行切分: 可變與不可變集合(Immutable and mutable coll...
    時(shí)待吾閱讀 5,959評(píng)論 0 4
  • 數(shù)組是一種可變的、可索引的數(shù)據(jù)集合。在Scala中用Array[T]的形式來(lái)表示Java中的數(shù)組形式 T[]。 v...
    時(shí)待吾閱讀 1,067評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,740評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • 這個(gè)端午節(jié)買票圍觀了老僵尸們參加的華語(yǔ)老友辯論賽。 想?yún)⒓拥闹饕虿皇且驗(yàn)槎q論愛(ài)辯論,只是因?yàn)槔峡雌孑庹f(shuō),突然...
    小妮崽閱讀 217評(píng)論 0 0

友情鏈接更多精彩內(nèi)容