先來看一段Java中的迴圈: for (int i = 1; i print(i + ",")) foreach是Range類的一個方法,這方法以一個函數值作為參數。所以要在括弧里提供一段函數代碼接受一個實參。在這個例子里,實參就是i。箭頭“=>”的作用是將左邊的參數列表和右側函數實現分割開來。 ...
先來看一段Java中的迴圈:
for (int i = 1; i < 4; i++) { System.out.print(i + ","); }
毫無疑問,scala可以讓這個迴圈更加簡潔。根據上一節中的內容,沒有必要顯示指定變數i的類型,我們甚至不需要聲明這個變數。其次輸出的語句也可以更加簡潔一些,在scala中可以直接使用println()這個方法輸出字元串。最後scala的迴圈結構也是非常的輕量級。好了,可以看一下代碼了:
for (i <- 1 to 3) { print(i + ",") }
在上面代碼中的迴圈結構里,箭頭(<-)左側是一個val(註意不是var)變數,右側是一個生成器表達式。和java中的迴圈不同,在這裡的每次迴圈中都會創建一個新的val變數i(而非是給i賦值),用生成器表達式產生出來的連續值進行初始化。
生成器表達式“1 to 3”生成的連續值包含了下界[1]和上界[3],如果用until方法替換to方法後,就可以排除上界。
to和until都是scala的RichInt類的方法,調用1 to 3等價於1.to(3),但是前者更加優雅。在scala中,如果方法有0或1個參數,點和括弧是可以丟掉的。如果方法的參數多於一個,那麼就必須保留括弧,但是點仍是可選的。再舉一個在java中非常常見的表達式為例:1 + 2在scala中實際上就是1.+(2),+也是一個方法而非是簡單的符號。
我們已經知道1 to 3返回的使一個連續值(Range),那麼就可以考慮使用Range的foreach方法來實現迴圈。代碼如下:
(1 to 3).foreach(i => print(i + ","))
foreach是Range類的一個方法,這方法以一個函數值作為參數。所以要在括弧里提供一段函數代碼接受一個實參。在這個例子里,實參就是i。箭頭“=>”的作用是將左邊的參數列表和右側函數實現分割開來。