【问题标题】:How to define a more concise scala function如何定义更简洁的scala函数
【发布时间】:2011-10-19 15:33:07
【问题描述】:

我正在使用 akka 库并提供部分功能,由演员在运行时通过热交换实现。

akka 热交换采用 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。

有没有更简洁的方法来使用 apply 或 extends Function 或 PartialFunction 来做这个类?

【问题讨论】:

  • 对不起,我不明白这个问题。你能详细说明/完善吗?
  • 你可以通过调用你的变量r而不是readingRequest来减少大约30%。

标签: scala akka partialfunction


【解决方案1】:

如果您的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)

【讨论】:

  • 这是一个极高并发的应用程序,我最初将它定义为具有单个函数的对象并切换到类。我担心许多演员访问同一个对象的单身问题。
  • 我真正想要的是类定义实际上是函数,不确定是否可能。
  • 如果它是不可变的/无状态的,那么任何共享都不是问题。如果您认为自己会遇到性能问题,那么实际拥有一个(或模拟一个的条件)然后测量实际开销可能会有所帮助。
  • 您可以通过扩展PartialFunction[Any, Unit] 并实现applyisDefinedAt 方法将函数定义为类,但我认为这不会有助于提高代码的可读性。
【解决方案2】:

顺便说一句,这减少了重复的苦差事:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    相关资源
    最近更新 更多