如何定义更简洁的scala函数

时间:2011-10-19 15:33:08

标签: scala akka partialfunction

我正在使用akka库并提供一个部分函数,​​由演员在运行时通过热插拔实现。

akka hot swap采用PartialFunction [Any,Unit]形式的参数。我将我的定义如下:

class Fake1Reader extends AbstractReader {

  def read: PartialFunction[Any, Unit] = {
    case readingRequest: ReadingRequest => {
      var reading: Reading = new ReadingImpl(readingRequest.getResourceId, "payload",
        Calendar.getInstance.getTime,
      readingRequest.getfrequency, readingRequest.getMappingName,
        readingRequest.getClassificationType,
      readingRequest.getReadingRequestId)
      sendConsumeMessage(reading)
    }
  }
}

所以为了使用这个功能,我必须提供一个新的Fake1Reader()。read。

使用应用或扩展Function或PartialFunction是否还有更简洁的方法来执行此类?

2 个答案:

答案 0 :(得分:2)

如果您的AbstractReader是无状态的,则可以定义object而不是class,以避免在每次使用时创建不必要的对象,并将您的函数设置为不可变的val'第

此外,伴随对象akka.actor.Actor将类型Receive定义为PartialFunction[Any, Unit]的别名,因此您可以像这样编写部分函数:

package foo    
object Fake1Reader extends AbstractReader {
  import akka.actor.Actor._

  val read: Receive = { 
    case readingRequest: ReadingRequest => /* implementation */
  }
}

用法:

import foo.Fake1Reader._

actorRef ! HotSwap(read)

答案 1 :(得分:2)

作为旁注,这减少了重复的苦差事:

case readingRequest: ReadingRequest => {
  import readingRequest._
  var reading: Reading = new ReadingImpl(getResourceId, "payload",
    Calendar.getInstance.getTime,
  getfrequency, getMappingName,
    getClassificationType,
  getReadingRequestId)
  sendConsumeMessage(reading)
}