据我所知,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) 我目前正在从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:有没有一种方法可以检查该检查以及该检查有什么好处?
提前致谢 :)
我有这个简单的代码
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在编译时显示错误?
提前谢谢了
我试图将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都是异步的.我不知道应该怎么做才能关闭它
提前谢谢了
我目前的项目是使用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) 这是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) 我有一些递归代码我想重构使用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异常.
那么如果它是一个函数,我怎么能使它递归递归
我尝试在 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)