我想把a List[Option[T]]变成a Option[List[T]].函数的签名类型是
def lo2ol[T](lo: List[Option[T]]): Option[List[T]]
Run Code Online (Sandbox Code Playgroud)
预期的行为是将仅包含Somes 的列表映射到Some包含元素内部元素的列表Some.另一方面,如果输入列表至少有一个None,则预期的行为是返回None.例如:
scala> lo2ol(Some(1) :: Some(2) :: Nil)
res10: Option[List[Int]] = Some(List(1, 2))
scala> lo2ol(Some(1) :: None :: Some(2) :: Nil)
res11: Option[List[Int]] = None
scala> lo2ol(Nil : List[Option[Int]])
res12: Option[List[Int]] = Some(List())
Run Code Online (Sandbox Code Playgroud)
没有scalaz的示例实现将是:
def lo2ol[T](lo: List[Option[T]]): Option[List[T]] = {
lo.foldRight[Option[List[T]]](Some(Nil)){(o, ol) => (o, ol) match {
case (Some(x), Some(xs)) => Some(x :: xs);
case _ => None : Option[List[T]];
}}} …Run Code Online (Sandbox Code Playgroud) 从一个更大的例子中提取的下面的宏应该创建一个只有对以下内容的引用的树this:
def echoThisImpl(c:Context): c.Expr[Any] = {
import c.universe._
val selfTree = This(c.enclosingClass.symbol)
c.Expr[AnyRef](selfTree)
}
def echoThis: Any = macro CallMacro.echoThisImpl
Run Code Online (Sandbox Code Playgroud)
然而,对于一个呼叫echoThis如
object Testing extends App {
val thisValue = CallMacro.echoThis
println(thisValue)
}
Run Code Online (Sandbox Code Playgroud)
无法使用消息进行编译
[error] /home/rafael/dev/scala/goose/goose-macros/src/test/scala/Testing.scala:8: type mismatch;
[error] found : <noprefix>
[error] required: Any
[error] val thisValue = CallMacro.echoThis
Run Code Online (Sandbox Code Playgroud)
如果我设置-Ymacro-debug-lite标志,则生成的树是This(newTermName("<local Testing>")).
当配置为事务性生产者时,在面向请求(例如http或RPC服务器)的应用程序中管理Kafka生产者对象的最佳实践是什么?具体来说,如何在服务线程之间共享生产者对象,以及如何定义transactional.id这些对象的配置值?
在非事务性使用中,生产者对象是线程安全的,并且在所有请求服务线程之间共享一个对象是很常见的。设置供 kafka 消费者线程使用的事务性生产者对象也很简单,只需为每个消费者线程实例化一个对象即可。
将事务生产者与面向请求的应用程序相结合似乎更加复杂,因为服务线程的生命周期通常由线程池动态控制。我可以想到一些选择,但都有缺点:
transactional.id这些对象,因为它们的生命周期并没有像文档所述那样清晰地映射到分区、有状态应用程序中的分片标识符。还有其他选择吗?有没有一个最佳的方法?
scala ×2
apache-kafka ×1
macros ×1
option ×1
scala-2.10 ×1
scala-macros ×1
scalaz ×1
transactions ×1