36.scala编程思想笔记——简洁性
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50445789
源码下载连接请见第一篇笔记。
Scala可以简介的表示概念,有时甚至可以说是过于简洁。
当让过于简洁性可能会让人产生一种过于复杂的印象。
1. 消除中间结果
在组合表达式中,最后一个表达式会变成整个表达式结果,如下,值会被捕获到val result中,然后result从方法中返回:
import com.atomicscala.AtomicTest._
def filterWithYield1(
v:Vector[Int]):Vector[Int] = {
val result =for {
n <- v
if n <10
if n % 2 !=0
} yield n
result
}
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
filterWithYield1(v) is Vector(1,3,5,7)
与将值放置到中间结果中不同,推导自身可以产生结果:
如下:
import com.atomicscala.AtomicTest._
def filterWithYield2(
v:Vector[Int]):Vector[Int]= {
for {
n <- v
if n <10
if n % 2 !=0
} yield n
}
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
filterWithYield2(v) is Vector(1,3,5,7)
2. 删除不必要的花括号
如果一个方法由单个表达式构成,那么环绕该方法的花括号就不是必须的。例如:
import com.atomicscala.AtomicTest._
def filterWithYield3(
v:Vector[Int]):Vector[Int] =
for {
n <- v
if n <10
if n % 2 !=0
} yield n
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
filterWithYield3(v) is Vector(1,3,5,7)
3. 是否使用分号?
在推导的花括号内有多个不同的表达式。行分隔符用来确定每个表达式的结束。例如:
import com.atomicscala.AtomicTest._
// Semicolons allow a single-line for:
def filterWithYield4(
v:Vector[Int]):Vector[Int] =
for{n <-v; if n < 10; if n % 2 != 0}
yield n
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
filterWithYield4(v) is Vector(1,3,5,7)
甚至可以将整个方法置于当个行中。
Scala作者建议,”不要使用分号”
4. 移除不必要的参数
作为对象的函数中,foreach方法将匿名函数作用于序列中每个元素的用法。例如,调用print的匿名函数作用于String的每个字母:
"OttoBoughtAnAuto".foreach(c=> print(c))
println
"OttoBoughtAnAuto".foreach(print(_))
println
"OttoBoughtAnAuto".foreach(print)
5. 为返回类型使用类型推断
为了提高简洁性,可以使用Scala的类型推断,从而移除返回类型,如下:
import com.atomicscala.AtomicTest._
def explicitReturnType():Vector[Int] =
Vector(11,22, 99, 34)
explicitReturnType() is
Vector(11,22, 99, 34)
def inferredReturnType() =
Vector(11,22, 99, 34)
inferredReturnType() is
Vector(11,22, 99, 34)
def unitReturnType() {
Vector(11,22, 99, 34)
}
unitReturnType() is (())
为了让类型推断起作用,在方法参数列表和方法体之间的=仍然是必须的。如果没有=,意思该方法不会返回任何信息,这也可以用Unit或()来表示。
6. 用类型为名字起别名
当使用别人代码时候,可能发现他人名字太长,可以使用type关键字对现有名字起一个名字,如下:
import com.atomicscala.AtomicTest._
case class LongUnrulyNameFromSomeone()
type Short = LongUnrulyNameFromSomeone
new Short is LongUnrulyNameFromSomeone()
7. 需求平衡
Scala会尽量理解你的意图。最安全的实践Scala简洁性的方式就是从完全明确说明开始,逐渐简化你的代码。
有关简洁性的技术会产生更加紧凑的代码,但是也会使得更加难以阅读。要做出平衡。