Отсутствует тип параметра в applyOrElse Scala

У меня есть этот код, где я пытаюсь вызвать частичную функцию. Когда я создаю свой проект, я получаю сообщение об ошибке missing parameter type ++ headerExtractor.applyOrElse(event, _ => Map.empty).

Я просмотрел другие сообщения, но я чувствую, что это должно работать. Что я делаю не так?

Я вызываю здесь headerExtractor

private def publishToProfileExchange(customer: Schema.Customer, event: Schema.CustomerEvent): Future[Done] = {
  val messageType: String = "ProfileEvent"
  val headers: Map[String, AnyRef] = Map(
    "profileId" -> customer.id.toString,
    "eventType" -> event.eventType,
    "type" -> messageType
  ) ++ headerExtractor.applyOrElse(event, _ => Map.empty)

  ...
  //valid return values would be here
}

private val headerExtractor: PartialFunction[Schema.CustomerEvent, Map[String, AnyRef]] = {
    case x if x.eventType.equalsIgnoreCase("message") && (x.eventData \ "incoming").asOpt[Boolean].getOrElse(false) =>
       Map("incomingMessage" -> "true")
}

person Rafa    schedule 24.07.2017    source источник
comment
Результат applyOrElse отбрасывается как Unit (вызовет предупреждение компиляции с соответствующими параметрами)   -  person cchantep    schedule 25.07.2017
comment
см. мою правку. Я не просто хочу вернуться сразу.   -  person Rafa    schedule 25.07.2017
comment
Использование Any или AnyRef снижает безопасность типов и предотвращает помощь от компилятора.   -  person cchantep    schedule 25.07.2017


Ответы (1)


вы должны указать тип параметра в своем .applyOrElse(). См. пример ниже

case class CustomerEvent(eventType: String, eventData: String)

val headerExtractor = new PartialFunction[CustomerEvent, Map[String, AnyRef]] {
  def apply(x: CustomerEvent): Map[String, AnyRef] = Map("incomingMessage" -> "true")
  def isDefinedAt(x: CustomerEvent): Boolean = x.eventType.equalsIgnoreCase("message")
}

assert(headerExtractor.applyOrElse(CustomerEvent("message", "{}"), (customerEvent: CustomerEvent) => Map.empty)
  == Map("incomingMessage" -> "true"))

// or simply do (_: CustomerEvent)

assert(headerExtractor.applyOrElse(CustomerEvent("message", "{}"), (_: CustomerEvent) => Map.empty)
      == Map("incomingMessage" -> "true"))

отрицательный случай

assert(headerExtractor.applyOrElse(CustomerEvent("something-else", "{}"), (_: CustomerEvent) => Map.empty) 
== Map())
person prayagupd    schedule 25.07.2017
comment
Я обновил строку до ) ++ headerExtractor.applyOrElse(event, customer: CustomerEvent => Map.empty), но она не работает - person Rafa; 25.07.2017
comment
это не _: CustomerEvent, это (_: CustomerEvent) или (customer: CustomerEvent) - person prayagupd; 25.07.2017