请选择 进入手机版 | 继续访问电脑版
楼主: Lisrelchen
1576 4

【】Scala基礎教程 [推广有奖]

  • 0关注
  • 62粉丝

VIP

院士

67%

还不是VIP/贵宾

-

TA的文库  其他...

Bayesian NewOccidental

Spatial Data Analysis

东西方数据挖掘

威望
0
论坛币
49955 个
通用积分
79.3687
学术水平
253 点
热心指数
300 点
信用等级
208 点
经验
41518 点
帖子
3256
精华
14
在线时间
766 小时
注册时间
2006-5-4
最后登录
2022-11-6

Lisrelchen 发表于 2017-2-18 09:03:10 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

本帖隐藏的内容

http://tw.gitbook.net/scala/scala_closures.html


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SCALA closure hide sure HTTP

Lisrelchen 发表于 2017-2-18 09:03:57 |显示全部楼层 |坛友微信交流群
Scala閉包
  1. 閉包是函數,它的返回值取決於此函數之外聲明一個或多個變量的值。考慮下麵的一塊使用匿名函數的代碼:

  2. val multiplier = (i:Int) => i * 10
  3. 在這裡,在函數體中使用的唯一變量, i * 0, 為i,其被定義為一個參數的函數。現在,讓我們來看另一塊代碼:

  4. val multiplier = (i:Int) => i * factor
  5. 有兩個自由變量的乘數:i和factor。其中一個i是一個正式函數參數。因此,它被綁定到一個新的值在乘數每次調用。然而,factor不是一個正式的參數,那麼這是什麼?讓我們增加一行代碼:

  6. var factor = 3
  7. val multiplier = (i:Int) => i * factor
  8. 現在,factor具有參考變量在函數之外,但為封閉範圍的變量。讓我們試試下麵的例子:

  9. object Test {
  10.    def main(args: Array[String]) {
  11.       println( "muliplier(1) value = " +  multiplier(1) )
  12.       println( "muliplier(2) value = " +  multiplier(2) )
  13.    }
  14.    var factor = 3
  15.    val multiplier = (i:Int) => i * factor
  16. }
  17. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  18. C:/>scalac Test.scala
  19. C:/>scala Test
  20. muliplier(1) value = 3
  21. muliplier(2) value = 6

  22. C:/>
  23. 上麵的函數引用factor並讀取每個時間的當前值。如果函數冇有外部引用,那麼它就是封閉了自己。無需外部環境是必需的。
复制代码

使用道具

Lisrelchen 发表于 2017-2-18 09:06:47 |显示全部楼层 |坛友微信交流群
Scala字符串
  1. 考慮下麵這個簡單的例子,我們給一個字符串類型的 val 變量:

  2. object Test {
  3.    val greeting: String = "Hello, world!"

  4.    def main(args: Array[String]) {
  5.       println( greeting )
  6.    }
  7. }
  8. 在這裡,上麵的值類型是從Java的java.lang.String借來的,因為Scala的字符串也是Java字符串。這一點是非常好的,要注意:每一個Java類可用在Scala中。因此,Scala冇有String類並直接利用Java字符串String類。因此,這一章已被寫入保持Java String的基礎。

  9. 在Scala中與在Java中一樣,一個字符串是不可變的對象,也就是,這是不能被修改的對象。另一方麵,對象是可以修改的,如數組對象,被稱為可變對象。由於字符串是非常有用的對象,在本節的其餘部分,我們目前最重要了解類java.lang.String的方法定義。

  10. 創建字符串:
  11. 最直接的方法來創建一個字符串的編寫方法是:

  12. var greeting = "Hello world!";

  13. or

  14. var greeting:String = "Hello world!";
  15. 每當遇到一個字符串在代碼中,編譯器創建String對象及其值,在這個示例中使用:“Hello world!”,但如果你喜歡,可以給字符串,因為這裡我已經在聲明中交替顯示。

  16. object Test {
  17.    val greeting: String = "Hello, world!"

  18.    def main(args: Array[String]) {
  19.       println( greeting )
  20.    }
  21. }
  22. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  23. C:/>scalac Test.scala
  24. C:/>scala Test
  25. Hello, world!

  26. C:/>
  27. 正如前麵提到的,String類是不可變的,所以一旦它被創建,String 對象不能改變。如果需要做大量修改字符的字符串,那麼應該使用在Scala提供字符串構建器類( String Builder )。

  28. 字符串長度:
  29. 用於獲得關於對象的信息的方法是已知的存取方法。可以使用字符串使用一個存取方法是length()方法,它返回包含在字符串對象中的字符數。

  30. 下麵兩行代碼被執行之後,len 等於17:

  31. object Test {
  32.    def main(args: Array[String]) {
  33.       var palindrome = "Dot saw I was Tod";
  34.       var len = palindrome.length();
  35.       println( "String Length is : " + len );
  36.    }
  37. }
  38. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  39. C:/>scalac Test.scala
  40. C:/>scala Test
  41. String Length is : 17

  42. C:/>
  43. 連接字符串:
  44. String類包括用於連接兩個字符串的方法:

  45. string1.concat(string2);
  46. 這返回一個string1將string2添加到它的末尾的一個新字符串。也可以使用concat()方法用字符串,如:

  47. "My name is ".concat("Zara");
  48. 字符串比較常用連接在一起,使用+運算符,如:

  49. "Hello," + " world" + "!"
  50. 這將產生:

  51. "Hello, world!"
  52. 讓我們來看看下麵的例子:

  53. object Test {
  54.    def main(args: Array[String]) {
  55.       var str1 = "Dot saw I was ";
  56.       var str2 =  "Tod";
  57.       println("Dot " + str1 + str2);
  58.    }
  59. }
  60. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  61. C:/>scalac Test.scala
  62. C:/>scala Test
  63. Dot Dot saw I was Tod

  64. C:/>
  65. 創建格式化字符串:
  66. 已經有兩個方法:printf()和format()方法使用格式化數字打印輸出。 String類有一個等價類的方法,format(),它返回一個String對象,而不是一個PrintStream對象。讓我們看看下麵的例子,這是使用printf()方法:

  67. object Test {
  68.    def main(args: Array[String]) {
  69.       var floatVar = 12.456
  70.       var intVar = 2000
  71.       var stringVar = "Hello, Scala!"
  72.       var fs = printf("The value of the float variable is " +
  73.                    "%f, while the value of the integer " +
  74.                    "variable is %d, and the string " +
  75.                    "is %s", floatVar, intVar, stringVar)
  76.       println(fs)
  77.    }
  78. }
  79. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  80. C:/>scalac Test.scala
  81. C:/>scala Test
  82. The value of the float variable is 12.456000, while the
  83. value of the integer var iable is 2000, and the
  84. string is Hello, Scala!()

  85. C:/>
  86. 字符串的方法:
  87. 以下是由java.lang.String類中定義,並且可以直接在Scala程序中使用方法列表:

  88. SN        方法及描述
  89. 1        char charAt(int index)
  90. 返回指定索引處的字符
  91. 2        int compareTo(Object o)
  92. 該字符串與另一個對象比較
  93. 3        int compareTo(String anotherString)
  94. 按字典順序比較兩個字符串
  95. 4        int compareToIgnoreCase(String str)
  96. 比較兩個字符串字典順序,忽略大小寫差異
  97. 5        String concat(String str)
  98. 將指定字符串添加這個字符串的結尾處
  99. 6        boolean contentEquals(StringBuffer sb)
  100. 返回true當且僅當此String表示的字符與指定的StringBuffer相同的序列
  101. 7        static String copyValueOf(char[] data)
  102. 返回表示所指定的數組中的字符序列的字符串
  103. 8        static String copyValueOf(char[] data, int offset, int count)
  104. 返回表示所指定的數組中的字符序列的字符串。
  105. 9        boolean endsWith(String suffix)
  106. 測試此字符串是否以指定的後綴結束。
  107. 10        boolean equals(Object anObject)
  108. 比較該字符串和指定的對象。
  109. 11        boolean equalsIgnoreCase(String anotherString)
  110. 比較該字符串到另一個字符串,不考慮大小寫。
  111. 12        byte getBytes()
  112. 將此String解碼使用平台的默認字符集的字節序列,並將結果存儲到一個新的字節數組。
  113. 13        byte[] getBytes(String charsetName
  114. 將此String解碼使用指定的字符集的字節序列,並將結果存儲到一個新的字節數組。
  115. 14        void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
  116. 複製字符從這個字符串到目標字符數組。
  117. 15        int hashCode()
  118. 返回此字符串的哈希碼。
  119. 16        int indexOf(int ch)
  120. 返回此字符串指定字符第一次出現處的索引。
  121. 17        int indexOf(int ch, int fromIndex)
  122. 返回此字符串指定的字符,開始搜索指定索引處的第一次出現處的索引。
  123. 18        int indexOf(String str)
  124. 返回此字符串的指定子第一次出現處的索引。
  125. 19        int indexOf(String str, int fromIndex)
  126. 返回此字符串中第一次出現的指定子字符串,開始在指定的索引處的索引。
  127. 20        String intern()
  128. 返回字符串對象的規範表示。
  129. 21        int lastIndexOf(int ch)
  130. 返回此字符串指定字符最後一次出現處的索引。
  131. 22        int lastIndexOf(int ch, int fromIndex)
  132. 返回此字符串指定字符最後一次出現處的索引,搜索開始向後指定索引處。
  133. 23        int lastIndexOf(String str)
  134. 返回此字符串指定子的最右邊出現處的索引。
  135. 24        int lastIndexOf(String str, int fromIndex)
  136. 返回此字符串的指定子最後一次出現處的索引,搜索開始向後指定索引處。
  137. 25        int length()
  138. 返回此字符串的長度。
  139. 26        boolean matches(String regex)
  140. 判斷此字符串是否與給正則表達式匹配。
  141. 27        boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
  142. 測試兩個字符串區域是否相等。
  143. 28        boolean regionMatches(int toffset, String other, int ooffset, int len)
  144. 測試兩個字符串區域是否相等。
  145. 29        String replace(char oldChar, char newChar)
  146. 返回通過用newChar更換oldChar中出現的所有該字符串產生一個新的字符串。
  147. 30        String replaceAll(String regex, String replacement
  148. 替換此字符串匹配給定的正則表達式以給定替換的每個子字符串。
  149. 31        String replaceFirst(String regex, String replacement)
  150. 替換此字符串匹配給定的正則表達式以給定替換的第一子字符串。
  151. 32        String[] split(String regex)
  152. 來此字符串圍繞拆分給定的正則表達式的匹配。
  153. 33        String[] split(String regex, int limit)
  154. 圍繞拆分給定的正則表達式的匹配來此字符串。
  155. 34        boolean startsWith(String prefix)
  156. 測試此字符串是否以指定的前綴開始。
  157. 35        boolean startsWith(String prefix, int toffset)
  158. 測試這個字符串開頭是否以指定索引指定的前綴開始。
  159. 36        CharSequence subSequence(int beginIndex, int endIndex)
  160. 返回一個新的字符序列,它是此序列的子序列。
  161. 37        String substring(int beginIndex)
  162. 返回一個新字符串,它是此字符串的一個子字符串。
  163. 38        String substring(int beginIndex, int endIndex)
  164. 返回一個新字符串,它是此字符串的一個子字符串。
  165. 39        char[] toCharArray()
  166. 這個字符串到一個新的字符數組轉換。
  167. 40        String toLowerCase()
  168. 將所有在這個字符串的字符使用默認語言環境的規則轉換為小寫。
  169. 41        String toLowerCase(Locale locale)
  170. 將所有在此字符串中的字符使用給定Locale的規則轉換為小寫。
  171. 42        String toString()
  172. 這個對象(這已經是一個字符串!)本身被返回。
  173. 43        String toUpperCase()
  174. 將所有的字符在這個字符串使用默認語言環境的規則轉換為大寫。
  175. 44        String toUpperCase(Locale locale)
  176. 將所有的字符在這個字符串使用給定的Locale規則轉換為大寫。
  177. 45        String trim()
  178. 返回字符串的副本,以開頭和結尾的空白忽略。
  179. 46        static String valueOf(primitive data type x)
  180. 返回傳遞的數據類型參數的字符串表示。
复制代码

使用道具

Lisrelchen 发表于 2017-2-18 09:12:33 |显示全部楼层 |坛友微信交流群
  1. Scala數組
  2. 上一篇下一篇  
  3. Scala中提供了一種數據結構-數組,其中存儲相同類型的元素的固定大小的連續集合。數組用於存儲數據的集合,但它往往是更加有用認為數組作為相同類型的變量的集合。

  4. 取替聲明單個變量,如number0, number1, ..., 和number99,聲明一個數組變量,如號碼和使用numbers[0],numbers[1],...,numbers[99]表示單個變量。本基礎教程介紹了如何聲明數組變量,創建數組和使用索引的過程變量數組。數組的第一個元素的索引是數字0和最後一個元素的索引為元素的總數減去1。

  5. 聲明數組變量:
  6. 要使用的程序的數組,必須聲明一個變量來引用數組,必須指定數組變量可以引用的類型。下麵是語法聲明數組變量:

  7. var z:Array[String] = new Array[String](3)

  8. or

  9. var z = new Array[String](3)
  10. 在這裡,z被聲明為字符串數組,最多可容納三個元素。可以將值分配給獨立的元素或可以訪問單個元素,這是可以做到通過使用類似於以下命令:

  11. z(0) = "Zara"; z(1) = "Nuha"; z(4/2) = "Ayan"
  12. 在這裡,最後一個例子表明,在一般的索引可以是產生一個全數字的表達式。定義數組還有另一種方式:

  13. var z = Array("Zara", "Nuha", "Ayan")
  14. 下圖展示了數組myList。在這裡,myList中擁有10個double值,索引是從0到9。

  15. Scala Array
  16. 處理數組:
  17. 當要處理數組元素,我們經常使用循環,因為所有的數組中的元素具有相同的類型,並且數組的大小是已知的。這裡是展示如何創建,初始化和處理數組的完整的例子:

  18. object Test {
  19.    def main(args: Array[String]) {
  20.       var myList = Array(1.9, 2.9, 3.4, 3.5)
  21.       
  22.       // Print all the array elements
  23.       for ( x <- myList ) {
  24.          println( x )
  25.       }

  26.       // Summing all elements
  27.       var total = 0.0;
  28.       for ( i <- 0 to (myList.length - 1)) {
  29.          total += myList(i);
  30.       }
  31.       println("Total is " + total);

  32.       // Finding the largest element
  33.       var max = myList(0);
  34.       for ( i <- 1 to (myList.length - 1) ) {
  35.          if (myList(i) > max) max = myList(i);
  36.       }
  37.       println("Max is " + max);
  38.    
  39.    }
  40. }
  41. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  42. C:/>scalac Test.scala
  43. C:/>scala Test
  44. 1.9
  45. 2.9
  46. 3.4
  47. 3.5
  48. Total is 11.7
  49. Max is 3.5

  50. C:/>
  51. 多維數組:
  52. 有很多情況下,需要定義和使用多維數組(即數組的元素數組)。例如,矩陣和表格結構的實例可以實現為二維數組。

  53. Scala不直接支持多維數組,並提供各種方法來處理任何尺寸數組。以下是定義的二維數組的實例:

  54. var myMatrix = ofDim[Int](3,3)
  55. 這是一個具有每個都是整數,它有三個元素數組3元素的數組。下麵的代碼展示了如何處理多維數組:

  56. import Array._

  57. object Test {
  58.    def main(args: Array[String]) {
  59.       var myMatrix = ofDim[Int](3,3)
  60.       
  61.       // build a matrix
  62.       for (i <- 0 to 2) {
  63.          for ( j <- 0 to 2) {
  64.             myMatrix(i)(j) = j;
  65.          }
  66.       }
  67.       
  68.       // Print two dimensional array
  69.       for (i <- 0 to 2) {
  70.          for ( j <- 0 to 2) {
  71.             print(" " + myMatrix(i)(j));
  72.          }
  73.          println();
  74.       }
  75.    
  76.    }
  77. }
  78. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  79. C:/>scalac Test.scala
  80. C:/>scala Test
  81. 0 1 2
  82. 0 1 2
  83. 0 1 2

  84. C:/>
  85. 聯接數組:
  86. 以下是使用concat()方法來連接兩個數組的例子。可以通過多個陣列作為參數傳遞給concat()方法。

  87. import Array._

  88. object Test {
  89.    def main(args: Array[String]) {
  90.       var myList1 = Array(1.9, 2.9, 3.4, 3.5)
  91.       var myList2 = Array(8.9, 7.9, 0.4, 1.5)

  92.       var myList3 =  concat( myList1, myList2)
  93.       
  94.       // Print all the array elements
  95.       for ( x <- myList3 ) {
  96.          println( x )
  97.       }
  98.    }
  99. }
  100. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  101. C:/>scalac Test.scala
  102. C:/>scala Test
  103. 1.9
  104. 2.9
  105. 3.4
  106. 3.5
  107. 8.9
  108. 7.9
  109. 0.4
  110. 1.5

  111. C:/>
  112. 創建具有範圍數組:
  113. 下麵是示例,這使得使用range() 方法來產生包含在給定的範圍內增加整數序列的數組。可以使用最後一個參數創建序列; 如果不使用最後一個參數,然後一步將被假定為1。

  114. import Array._

  115. object Test {
  116.    def main(args: Array[String]) {
  117.       var myList1 = range(10, 20, 2)
  118.       var myList2 = range(10,20)

  119.       // Print all the array elements
  120.       for ( x <- myList1 ) {
  121.          print( " " + x )
  122.       }
  123.       println()
  124.       for ( x <- myList2 ) {
  125.          print( " " + x )
  126.       }
  127.    }
  128. }
  129. 讓我們編譯和運行上麵的程序,這將產生以下結果:

  130. C:/>scalac Test.scala
  131. C:/>scala Test
  132. 10 12 14 16 18
  133. 10 11 12 13 14 15 16 17 18 19

  134. C:/>
  135. Scala中數組方法:
  136. 以下是重要的方法,可以同時使用數組。如上所示,則必須使用任何提及的方法之前,要導入Array._包。有關可用方法的完整列表,請Scala中的官方文件。

  137. SN        方法及描述
  138. 1        def apply( x: T, xs: T* ): Array[T]
  139. 創建T對象,其中T可以是Unit, Double, Float, Long, Int, Char, Short, Byte, Boolean數組。
  140. 2        def concat[T]( xss: Array[T]* ): Array[T]
  141. 連接所有陣列成一個數組。
  142. 3        def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit
  143. 複製一個數組到另一個。相當於Java的System.arraycopy(src, srcPos, dest, destPos, length).
  144. 4        def empty[T]: Array[T]
  145. 返回長度為0的數組
  146. 5        def iterate[T]( start: T, len: Int )( f: (T) => T ): Array[T]
  147. 返回一個包含一個函數的重複應用到初始值的數組。
  148. 6        def fill[T]( n: Int )(elem: => T): Array[T]
  149. 返回包含某些元素的計算的結果的次數的數組。
  150. 7        def fill[T]( n1: Int, n2: Int )( elem: => T ): Array[Array[T]]
  151. 返回一個二維數組,其中包含某些元素的計算的結果的次數。
  152. 8        def iterate[T]( start: T, len: Int)( f: (T) => T ): Array[T]
  153. 返回一個包含一個函數的重複應用到初始值的數組。
  154. 9        def ofDim[T]( n1: Int ): Array[T]
  155. 創建數組給出的尺寸。
  156. 10        def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]]
  157. 創建了一個2維數組
  158. 11        def ofDim[T]( n1: Int, n2: Int, n3: Int ): Array[Array[Array[T]]]
  159. 創建3維數組
  160. 12        def range( start: Int, end: Int, step: Int ): Array[Int]
  161. 返回包含一些整數間隔等間隔值的數組。
  162. 13        def range( start: Int, end: Int ): Array[Int]
  163. 返回包含的範圍內增加整數序列的數組。
  164. 14        def tabulate[T]( n: Int )(f: (Int)=> T): Array[T]
  165. 返回包含一個給定的函數的值超過從0開始的範圍內的整數值的數組。
  166. 15        def tabulate[T]( n1: Int, n2: Int )( f: (Int, Int ) => T): Array[Array[T]]
  167. 返回一個包含給定函數的值超過整數值從0開始範圍的二維數組。
复制代码

使用道具

zzyftpl 在职认证  发表于 2017-2-18 09:25:41 |显示全部楼层 |坛友微信交流群
感谢楼主的分享

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 17:01