36.scala编程思想笔记——简洁性

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简洁性的方式就是从完全明确说明开始,逐渐简化你的代码。

         有关简洁性的技术会产生更加紧凑的代码,但是也会使得更加难以阅读。要做出平衡。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值