2017-09-26 3 views
2

Est-il possible de modéliser la correspondance sur un lazy val, déclaré comme Try, comme ceci?Motif correspondant à un essai paresseux val dans Scala?

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

Je reçois cette erreur:

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

Remarque, ce code alternatif fonctionne, mais je ne suis pas sûr que c'est la "voie 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) 
} 

Répondre

5

Il est certainement possible, vous avez juste le mauvais Success type importé:

found : akka.actor.Status.Success 

Vous avez besoin scala.util.Success au lieu

Une chose que vous ne devez pas faire appel est Try.get, qui explosera si le type de retour est un Failure. Au lieu de cela, faire:

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 est juste une construction linguistique qui fait que la valeur n'est jamais évaluée une fois. Le type sous-jacent, paresseux ou non, est toujours un Try que vous pouvez faire ce que vous faites avec.