是否有可能在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)
这肯定是可能的,你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你可以用它做的事情.
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |