小编Raf*_*ira的帖子

使用Scalaz将选项列表转换为List选项

我想把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)

scala option scalaz

28
推荐指数
2
解决办法
1万
查看次数

我如何引用在Scala宏中包含"this"?

从一个更大的例子中提取的下面的宏应该创建一个只有对以下内容的引用的树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>")).

macros scala scala-2.10 scala-macros

9
推荐指数
1
解决办法
995
查看次数

如何在面向请求的应用程序中管理 Kafka 事务生产者对象

当配置为事务性生产者时,在面向请求(例如http或RPC服务器)的应用程序中管理Kafka生产者对象的最佳实践是什么?具体来说,如何在服务线程之间共享生产者对象,以及如何定义transactional.id这些对象的配置值?

在非事务性使用中,生产者对象是线程安全的,并且在所有请求服务线程之间共享一个对象是很常见的。设置供 kafka 消费者线程使用的事务性生产者对象也很简单,只需为每个消费者线程实例化一个对象即可。

将事务生产者与面向请求的应用程序相结合似乎更加复杂,因为服务线程的生命周期通常由线程池动态控制。我可以想到一些选择,但都有缺点:

  1. 共享单个对象,通过某种互斥体防止并发。负载下的争用可能会是一个严重的问题。
  2. 为每个传入的请求实例化一个生产者对象。KafkaProducer 对象初始化很慢,因为它们维护网络连接、线程和其他重量级对象;为每个请求支付这笔费用似乎不切实际。
  3. 维护一个生产者对象池,并为每个请求租用一个。我看到的主要缺点是所需的机械数量。目前还不清楚如何配置transactional.id这些对象,因为它们的生命周期并没有像文档所述那样清晰地映射到分区、有状态应用程序中的分片标识符

还有其他选择吗?有没有一个最佳的方法?

transactions apache-kafka

5
推荐指数
1
解决办法
870
查看次数