Scala中的Try lazy val上的模式匹配?

Ror*_*ory 2 scala akka

是否有可能在a上lazy val声明匹配,声明为a Try,像这样?

lazy val kafkaProducer: Try[producer.KafkaProducer[Array[Byte], String]] = Try(kafkaProducerSettings.createKafkaProducer())
...
kafkaProducer.get match {
  case Success(_) => Source.single(producerRecord()).runWith(Producer.plainSink(kafkaProducerSettings, kafkaProducer.get))
  case Failure(x) => Future.failed(x)
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

constructor cannot be instantiated to expected type;
[error]  found   : akka.actor.Status.Success
[error]  required: org.apache.kafka.clients.producer.KafkaProducer[Array[Byte],String]
[error]         case Success(_) => Source.single(producerRecord()).runWith(Producer.plainSink(kafkaProducerSettings, kafkaProducer.get))
Run Code Online (Sandbox Code Playgroud)

注意,这个替代代码有效,但我不确定它是"Scala方式":

lazy val kafkaProducer: producer.KafkaProducer[Array[Byte], String] = kafkaProducerSettings.createKafkaProducer()
...
val tryAccessLazyKafkaProducer = Try(kafkaProducer)
if (tryAccessLazyKafkaProducer.isSuccess) {
  Source.single(producerRecord()).runWith(Producer.plainSink(kafkaProducerSettings, kafkaProducer))
} else {
  Future.failed(tryAccessLazyKafkaProducer.failed.get)
}
Run Code Online (Sandbox Code Playgroud)

Yuv*_*kov 5

这肯定是可能的,你Success输入的错误类型:

found   : akka.actor.Status.Success
Run Code Online (Sandbox Code Playgroud)

你需要scala.util.Success改为

你不能做的一件事是调用Try.get,如果返回的类型是a,它将爆炸Failure.相反,做:

import scala.util.Success
import scala.util.Failure

kafkaProducer match {
    case Success(producer) => Source.single(producerRecord()).runWith(Producer.plainSink(kafkaProducerSettings, producer))
    case failure: Failure => failure
}
Run Code Online (Sandbox Code Playgroud)

lazy只是一种语言结构,它确保只对值进行一次评估.底层类型,无论是否懒惰,仍然是Try你可以用它做的事情.