标签: scala

Scala相当于Java的Number

我正在尝试为数字域类型构建一个类型层次结构.例如Year是一个Int(这是一个Number),一个Percentage是一Double,这是一个Number等我需要的层次结构,这样我可以调用toInttoDouble上的值.

但是,原始数字类型的Scala类型层次结构除了之外没有共同的祖先AnyVal.这不包含to{Int, Double}我需要的功能.

我能找到的最接近的类型是Numeric[T],它似乎主要存在于某些编译器技巧中.

在Java中,所有数字都来自Number(包括任意精度的数字).如何定义一个满足Scala中数值类型对象的接口?

我正在用鸭子打字来攻击它:

Any {
  def toInt: Int
  def toDouble: Double
}
Run Code Online (Sandbox Code Playgroud)

这不仅啰嗦,而且还会产生运行时反射成本.有更好的吗?

scala

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

斯卡拉.获取List的第一个元素

为什么queue.get()返回空列表?

class MyQueue{
  var queue=List[Int](3,5,7)

  def get(){
    this.queue.head
  }
}

object QueueOperator {
  def main(args: Array[String]) {
    val queue=new MyQueue
    println(queue.get())
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能得到第一个元素?

scala list

26
推荐指数
1
解决办法
6万
查看次数

了解如何使用apply和unapply

我正在努力更好地理解正确的用法applyunapply方法.

考虑到我们想要序列化和反序列化的对象,这是正确的使用(即Scala方式)使用applyunapply

case class Foo
object Foo {
    apply(json: JValue): Foo = json.extract[Foo]
    unapply(f: Foo): JValue = //process to json
}
Run Code Online (Sandbox Code Playgroud)

scala

26
推荐指数
3
解决办法
2万
查看次数

使用Java 8 Streams API随机播放整数列表

我尝试使用Streams API将以下Scala行转换为Java 8:

// Scala
util.Random.shuffle((1 to 24).toList)
Run Code Online (Sandbox Code Playgroud)

要在Java中编写等效项,我创建了一系列整数:

IntStream.range(1, 25)
Run Code Online (Sandbox Code Playgroud)

我怀疑toList在流API中找到了一个方法,但IntStream只知道奇怪的方法:

collect(
  Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
Run Code Online (Sandbox Code Playgroud)

如何使用Java 8 Streams API对列表进行混洗?

java scala java-stream

26
推荐指数
4
解决办法
2万
查看次数

为成功和失败绘制未来

我有一个Future [T],我想在成功和失败方面映射结果.

比如,像

val future = ... // Future[T]
val mapped = future.mapAll { 
  case Success(a) => "OK"
  case Failure(e) => "KO"
}
Run Code Online (Sandbox Code Playgroud)

如果我使用mapflatmap,它只会映射成功期货.如果我使用recover,它只会映射失败的期货.onComplete执行回调但不返回修改后的未来.Transform会工作,但需要2个函数而不是部分函数,​​所以有点丑陋.

我知道我可以创造一个新的Promise,并用/ onComplete或完成它,但我希望有一些我遗漏的东西,这将允许我用一个PF做上述.onSuccessonFailure

scala

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

是否可以使用gradle开发scala项目?

我正在使用sbt来构建scala项目,但它似乎总是太复杂(不熟悉)而且对我很重.我也使用gradle来构建java项目,这让我很开心.

我想知道是否可以使用gradle来构建scala项目?有没有使用gradle的大型scala项目?

我的一些朋友告诉我"永远不会想到使用gradle进行scala项目",但拒绝告诉我原因.

scala gradle sbt

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

将ActorRef传递给其他Actors好坏?

我试图弄清楚我将Akka传递ActorRef给其他演员的用法是不是反模式.

我的系统里有几个演员.有些人长寿(restClientRouter,publisher),有些人在完成工作后死亡(geoActor).短命的演员需要向长寿演员发送信息,因此需要他们ActorRef的.

  //router for a bunch of other actors
  val restClientRouter = createRouter(context.system)

  //publishers messages to an output message queue
  val publisher: ActorRef = context.actorOf(Props(new PublisherActor(host, channel)), name = "pub-actor")     

  //this actor send a message to the restClientRouter and then sends the response
  //to the publisher 
  val geoActor = context.actorOf(Props(new GeoInferenceActor(restClientRouter, publisher)), name = "geo-inference-actor")
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将ActorRefs(restClientRouterpublisher)传递给了构造函数GeoInferenceActor.这样可以吗?有没有更好的方法呢?

design-patterns scala anti-patterns actor akka

26
推荐指数
2
解决办法
4643
查看次数

如何在spark中对每个执行程序执行一次操作

我有一个存储在S3中的weka模型,大小约为400MB.现在,我有一些记录,我想在其中运行模型并执行预测.

为了进行预测,我试过的是,

  1. 在驱动程序上下载并加载模型作为静态对象,将其广播给所有执行程序.对预测RDD执行映射操作.---->不工作,如在Weka中执行预测,需要修改模型对象,并且广播需要只读副本.

  2. 在驱动程序上下载并加载模型作为静态对象,并在每个映射操作中将其发送到执行程序.----->工作(效率不高,如在每个地图操作中,我传递400MB对象)

  3. 在驱动程序上下载模型并将其加载到每个执行程序上并将其缓存在那里.(不知道该怎么做)

有人知道如何在每个执行程序上加载模型一次并将其缓存,以便其他记录我不再加载它?

scala partitioning weka apache-spark

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

如何在spark-shell中运行外部jar函数

我通过这个文件树从项目创建了一个jar包:

build.sbt
src/main
src/main/scala
src/main/scala/Tester.scala
src/main/scala/main.scala
Run Code Online (Sandbox Code Playgroud)

其中Tester是一个函数类(name是print()),main有一个要运行的对象,打印出"Hi!" (来自spark文档)成功创建了一个由sbt创建的jar文件,并且在spark-submit中运行良好

现在我想将它添加到spark-shell中并使用Tester类作为创建对象的类...我将jar文件添加到spark-default.conf中但是:

scala> val t = new Tester();
<console>:23: error: not found: type Tester
       val t = new Tester();
Run Code Online (Sandbox Code Playgroud)

scala apache-spark

26
推荐指数
2
解决办法
3万
查看次数

如何使用circe解码ADT而不消除对象的歧义

假设我有这样的ADT:

sealed trait Event

case class Foo(i: Int) extends Event
case class Bar(s: String) extends Event
case class Baz(c: Char) extends Event
case class Qux(values: List[String]) extends Event
Run Code Online (Sandbox Code Playgroud)

circe中Decoder[Event]实例的默认泛型推导要求输入JSON包含一个包装器对象,该对象指示表示的是哪个case类:

scala> import io.circe.generic.auto._, io.circe.parser.decode, io.circe.syntax._
import io.circe.generic.auto._
import io.circe.parser.decode
import io.circe.syntax._

scala> decode[Event]("""{ "i": 1000 }""")
res0: Either[io.circe.Error,Event] = Left(DecodingFailure(CNil, List()))

scala> decode[Event]("""{ "Foo": { "i": 1000 }}""")
res1: Either[io.circe.Error,Event] = Right(Foo(1000))

scala> (Foo(100): Event).asJson.noSpaces
res2: String = {"Foo":{"i":100}}
Run Code Online (Sandbox Code Playgroud)

这种行为意味着如果两个或多个案例类具有相同的成员名称,我们就不必担心含糊不清,但它并不总是我们想要的 - 有时我们知道展开的编码是明确的,或者我们想要通过指定顺序来消除歧义应该尝试每个案例类,或者我们只是不在乎.

如何在Event没有包装器的情况下对ADT 进行编码和解码(最好不必从头开始编写我的编码器和解码器)?

(这个问题经常出现 - 例如今天早上 …

json scala algebraic-data-types circe generic-derivation

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