吐槽
— 如无必要,勿增实体 —
槽点1:多参数列表
你说一个参数列表也够了,非要使用多个参数列表,多个参数列表也就算了,调用的时候第二个参数列表即可以用圆括号也可以用花括号,然后花括号还可以换行,然后函数传参还是个匿名函数,最后搞的像写了一个函数一样,其实tm的是再调用一个函数。
比如这样的:
s.draw(Point(1.0, 2.0))(str => println(s"ShapesDrawingActor: $str"))
//上面的和下面相等
s.draw(Point(1.0, 2.0)) { str =>
println(s"ShapesDrawingActor: $str")
}
我就想吐槽了,这么多程序员,同样一个功能,有n总写法。居然还觉得优雅。
槽点2:字面量语法
真实恶心的语法。
- 字面量怎么理解呢:可以理解为用"类型"两个字代替,也可以不去理解他,即省略。也可以理解为常量。
- 看似减少了打字的数量,实际上增加了阅读的难度,并且让实现一个功能又多出了一种写法,那么问题来了,不同的人又是不同的写法。
2.1 函数字面量
你看又是等号,又是两个等号箭头。tmd。
val f1: (Int,String) => String = (i, s) => s+i
val f2: Function2[Int,String,String] = (i, s) => s+i
- val表示定义了一个常量。
2.2 定义元组
val t1: (Int,String) = (1, "two")
val t2: Tuple2[Int,String] = (1, "two")
槽点3:把省略当优雅
总以为省略的了一些东西,让代码变得更段,然后就更易读。省略很长的多余代码也就算了,为啥连 点 号都要省略。python都没有这样会搞事情,起码一种表达往往就一种写法,scala就特别会搞事情,一个事情就有很多种的表达方式。
比如:
1
- 定义无参的函数可以带括号也可以不带。调用也可以带和不带。新手需要花时间和精力去熟悉两者的使用情况。
- 一个代码可以省略成这样,从上到下依次省略一些东西,直至看不懂为止(多写点会死啊!!):
List(1, 2, 3, 4).filter((i: Int) => isEven(i)).foreach((i: Int) => println(i))
List(1, 2, 3, 4).filter(i => isEven(i)).foreach(i => println(i))
List(1, 2, 3, 4).filter(isEven).foreach(println)
List(1, 2, 3, 4) filter isEven foreach println
2
for (breed <- dogBreeds)
println(breed)
连括号都省了。
槽点4,把if写到for里面,俗称保护式
而且多个if之间也不加and或者or。
val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund", "Scottish Terrier", "Great Dane", "Portuguese Water Dog")
for (breed <- dogBreeds
if breed.contains("Terrier")
if !breed.startsWith("Yorkshire") ) println(breed)
for (breed <- dogBreeds
if breed.contains("Terrier") && !breed.startsWith("Yorkshire") ) println(breed)
还有一点就是,可以省略 区分代码段的东西。
4.1 tm的还可以在里面写表达式。
val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund", "Scottish Terrier", "Great Dane", "Portuguese Water Dog")
for { breed <- dogBreeds
upcasedBreed = breed.toUpperCase() //就是这个,明明可以写在for循环里面。
}
println(upcasedBreed)
槽点5,大括号可以代替小括号
居然可以用大括号代替小括号,理由居然是更好看,好看个鬼。有些人写大括号,有些人写小括号,好看个鬼。
比如:
例1
for (breed <- dogBreeds)
println(breed)
我tm也可以这样写:
for {breed <- dogBreeds}
println(breed)
真tm的好看。不知道的还以为是死循环呢。