2017-09-26 39 views
2

是否可以對lazy val進行模式匹配,聲明爲Try,如下所示?在Scala中嘗試lazy val的模式匹配?

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) 
} 

我得到這個錯誤:

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)) 

注意,這種替代代碼的工作,但我不知道它的 「斯卡拉方式」:

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) 
} 

回答

5

這絕對可能,你只是有錯誤Success類型進口:

found : akka.actor.Status.Success 

你需要scala.util.Success代替

有一件事情你一定不能做的是電話Try.get,如果返回類型是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 
} 

lazy僅僅是一個語言結構,這使得確定值只會被計算一次。底層的類型,無論是否懶惰,仍然是一個Try,你可以做你所做的事情。