小编Xia*_*ong的帖子

为什么Scalaz\/ type有getOrElse但没有得到?

据我所知,Scalaz \/没有get方法.有时我确信包含的值\/是正确的值,我不想使用getOrElse.我想直接得到它.

("3".right[Int]) getOrElse("123123123") // 3

if (t.isRight) t.get // compilation error, no get method
Run Code Online (Sandbox Code Playgroud)

如果有保证,我怎样才能直接获得正确的价值.

我有两种方法可以获得价值,但两者看起来都有点冗长.

1:更改为scala

val t = "3".right[Int]
val either = t.toEither

if (either.isRight) either.right.get
else either.left.get
Run Code Online (Sandbox Code Playgroud)

2:使用getOrElse

("3".right[Int]) getOrElse("123123123") // but for some cases I don't have this default value
Run Code Online (Sandbox Code Playgroud)

scala scalaz

4
推荐指数
1
解决办法
314
查看次数

Kafka生产者弹性配置:失败但永不阻塞

我目前正在从netflix(https://www.slideshare.net/wangxia5/netflix-kafka)学习一些Kafka最佳实践。这是一张很好的幻灯片。但是,我真的不理解其中提到的有关生产者弹性配置的一张幻灯片(幻灯片18),我希望stackoverflow中的某个人非常乐意为我提供相关信息(不能找到视频或联系作者...)。

幻灯片提到:失败,但从不阻止生产者弹性配置

Block.on.buffer.full=false 
Run Code Online (Sandbox Code Playgroud)

即使以为这是已弃用的配置,我想的想法是让生产者立即失败而不是阻塞等待。在最新的kafka配置中,我可以使用一个较小的值block.max.ms来使生产者无法发送消息而不是阻止消息。

问题1:为什么我们要立即失败,是否意味着以后重试而不是阻止它?

Handle Potential Block for first meta data request
Run Code Online (Sandbox Code Playgroud)

问题2:我可以了解用户端的元数据。即注册消费者组和东西,但是从生产者的角度来看元数据请求是什么?并且它可能被阻止了吗?是否有任何kafka文档来描述

Periodically check whether Kafka producer was open successfully 
Run Code Online (Sandbox Code Playgroud)

问题3:有没有一种方法可以检查该检查以及该检查有什么好处?

提前致谢 :)

apache-kafka

3
推荐指数
1
解决办法
675
查看次数

如何在编译时失败而不是运行时异常

我有这个简单的代码

def doStuff(x: Int) = {
 ...
}
Run Code Online (Sandbox Code Playgroud)

但是,如果x小于或等于0,则此方法不支持,因此我使用require

def doStuff(x: Int) = {
   require(x > 0, "x should be greater than 0")
}

doStuff(0) // runtime exception
Run Code Online (Sandbox Code Playgroud)

但是这发生在运行时异常中,如何更改它以使用Implicit在编译时显示错误?

提前谢谢了

scala implicit-conversion

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

如何在scalaz Task中关闭AsyncHttpClient

我试图将AsyncHttpClient和Scalaz Task结合在一起.通常,如果我使用AsyncHttpClient,我可以调用client.close来停止客户端.

val asyncHttpClient = new AsyncHttpClient()
println(asyncHttpClient.prepareGet("http://www.google.com"))

asyncHttpClient.close()
Run Code Online (Sandbox Code Playgroud)

所以当前将停止.但是,如果我将api调用包装到Task中.我不知道如何阻止它.

  def get(s: String) = Task.async[Int](k => {
    asyncHttpClient.prepareGet(s).execute(toHandler)
    Thread.sleep(5000)
    asyncHttpClient.closeAsynchronously()
  } )

  def toHandler[A] = new AsyncCompletionHandler[Response] {
    def onCompleted(r: Response) = {
      println("get response ", r.getResponseBody)
      r
    }
    def onError(e: Throwable) = {
      println("some error")
      e
    }
  }

println(get("http://www.google.com").run)
Run Code Online (Sandbox Code Playgroud)

当前进程仍在运行.我在想,原因是Task和AsynClient都是异步的.我不知道应该怎么做才能关闭它

提前谢谢了

scala scalaz asynchttpclient

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

案例对象可以作为一个州

我目前的项目是使用Java.我们将业务逻辑推送到代表特定状态(新的,已注册的等)的枚举.在scala中,我只是想知道使用case对象作为状态是一个好主意吗?有什么缺点.

一个简单的例子

trait State {
   def read() : Try[String] = {
  Failure(new IllegalStateException("too young to read"))
}
}
case object child extends State

case object young extends State {
  override def read() : Try[String] = {
    Success("young people read book")
  }
}
case object elder extends State {
  override def read() : Try[String] = {
    Success("elder people read book")
  }
}

class Person(state : State) {

   def read() : Try[String] = {
      state.read()
   }
}
Run Code Online (Sandbox Code Playgroud)

state design-patterns scala

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

用于akka流Source.actorRef缓冲区和OverflowStrategy的接收器折叠

这是akka文档的代码片段

val sinkUnderTest = Flow[Int].map(_.toString).toMat(Sink.fold("")(_ + _))(Keep.right)

val (ref, future) = Source.actorRef(3, OverflowStrategy.fail)
  .toMat(sinkUnderTest)(Keep.both).run()

ref ! 1
ref ! 2
ref ! 3
ref ! akka.actor.Status.Success("done")

val result = Await.result(future, 3.seconds)
assert(result == "123")
Run Code Online (Sandbox Code Playgroud)

这是一个有效的代码片段,但是,如果我使用ref来告诉另一条消息ref ! 4,我会得到一个例外akka.stream.BufferOverflowException: Buffer overflow (max capacity was: 3)

我想缓冲区大小3应该足够了.原因是折叠操作是(acc,ele)=> acc,所以它需要累加器和元素来返回新的值累加器.

所以我改变了代码让另一个演员告诉等待3秒.它再次运作.

  val sinkUnderTest = Flow[Int].map(_.toString).toMat(Sink.fold("")(_ + _))(Keep.right)

  private val (ref, future): (ActorRef, Future[String]) = Source.actorRef(3, OverflowStrategy.backpressure).toMat(sinkUnderTest)(Keep.both).run()

  ref ! 1
  ref ! 2
  ref ! 3
  Thread.sleep(3000)
  ref ! 4
  ref …
Run Code Online (Sandbox Code Playgroud)

scala akka akka-stream

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

可以函数tail-recursive

我有一些递归代码我想重构使用Enumerator的尾递归,我可以简化这种递归看起来像这样,请忽略这个功能想要实现的功能.

@tailrec
def doStuff: List[Int] => Int = {
      case Nil => 0
      case x :: xs => doStuff(xs)
    }
Run Code Online (Sandbox Code Playgroud)

如果我摆脱tailrec注释,它工作正常,结构看起来像这个doStuff(doStuff(doStuff(..))).它将具有stackoverflow异常.

那么如果它是一个函数,我怎么能使它递归递归

scala tail-recursion function

0
推荐指数
1
解决办法
121
查看次数

2 sum算法的改进解

我尝试在 leetcode ( https://leetcode.com/problems/two-sum/#/description )中找出算法的功能实现

我想我需要的是 3 个函数,如下所示:

  • List[Int] => List[(Int, Int)] 用位置压缩元素
  • List[(Int, Int)], Int, Int => List[((Int, Int) , (Int, Int))] 用剩余的元素和位置压缩元素和位置,并使用 Sum 进行过滤
  • List[((Int, Int) , (Int, Int))] => List[(Int, Int)] 映射到位置

代码如下所示:

  def findTwoSumElements(xs: List[Int], sum: Int): List[(Int, Int)] = {
    val zipWithIndex = xs.zipWithIndex
    var tailElements = zipWithIndex

    val result = zipWithIndex.map(t => {
      val element = zipAndFilter(tailElements, t, sum)
      tailElements = tailElements.tail
      element
     }
    )

    result.flatten.map(t => (t._1._2, t._2._2))
  }

  private def zipAndFilter(xs: List[(Int, …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala

0
推荐指数
1
解决办法
1619
查看次数