[随笔] scala每周一题

coollzh 2010-11-27
def isEven(n: Int) = (n % 2) == 0 
List(1, 2, 3, 4) filter isEven foreach println

第二句代码是用了scala的语法糖,请问用完整的常规语法该怎么写?
night_stalker 2010-11-28
这个东西是有陷阱的……

List(1,2,3,4) filter isEven foreach
println // 上一行为偶数个元素而且没隔空行,可以连起来


List(1,2,3,4) filter isEven foreach

println // 多空了一行,连不起来


List(1,2,3,4) filter isEven
foreach println // 上一行为奇数个,连不起来
coollzh 2010-11-28
这是为什么呢?

换行的话应该是一条独立的语句吧。
buptwhisper 2010-12-02
大约是
List(1, 2, 3, 4).filter(isEven(_)).foreach(println(_))
看看api了解一下
buptwhisper 2010-12-02
对于函数,如果它有0个或1个参数,可以用" "替换".",(arg)也可以替换成" arg"
llh110220 2010-12-03
buptwhisper 写道
大约是
List(1, 2, 3, 4).filter(isEven(_)).foreach(println(_))
看看api了解一下


就是这样地
itang 2010-12-03
主要是Partially applied function的应用:
    “method _ ”或带括号"method(_)" 形式Scala会将method 转换为对应的Function对象.   
    如果此method出现在了本应是Function的地方, 这时 "_" 都可以省略.
如:
scala> def isEven(n: Int) = (n % 2) == 0  
isEven: (n: Int)Boolean
scala> isEven _
res0: (Int) => Boolean = <function1>  //(注意到isEven _表达式值为Function1类型了)
scala> isEven(_)
res1: (Int) => Boolean = <function1>
scala> Array(1,2,3).map(String.valueOf) //类方法
res2: Array[java.lang.String] = Array(1, 2, 3) 

   
那么以下形式都是合法的:
List(1, 2, 3, 4).filter{ (x:Int) => isEven(x)}.foreach{ (it:Int) => println(it)}
List(1, 2, 3, 4).filter{ x:Int => isEven(x)}.foreach{it:Int => println(it)}
List(1, 2, 3, 4).filter{ x => isEven(x)}.foreach{it => println(it)}
List(1, 2, 3, 4).filter(isEven _ ).foreach{ println _}
List(1, 2, 3, 4).filter(isEven).foreach(println)

包括楼主写的
List(1, 2, 3, 4) filter isEven foreach println 
(method as operator形式)
willothe 2010-12-07
这样子一段代码会遍历多少次呢
Global site tag (gtag.js) - Google Analytics