我正在研究 spark - scala 并在 scala 中找到它。拆分与python不同。举个例子:
我的功能:
for (line <- lines) {
var fields = line.split("|")
if(fields.length > 1){
movieNames += (fields(0).toInt -> fields(1))
}
Run Code Online (Sandbox Code Playgroud)
给了我一个错误但是当我将其更改为...
for (line <- lines) {
var fields = line.split('|')
if(fields.length > 1){
movieNames += (fields(0).toInt -> fields(1))
}
Run Code Online (Sandbox Code Playgroud)
那么,它会解决,“|”和'|有什么区别?'在逻辑级别。
我尝试在 Scala 函数参数名称中使用尾随下划线以避免与关键字冲突type,但出现错误:
Welcome to Scala 2.13.1 (Java HotSpot(TM) 64-Bit Server VM, Java 11.0.1).
Type in expressions for evaluation. Or try :help.
scala> def foo(type_: Char): Char = type_
^
error: ':' expected but identifier found.
scala>
Run Code Online (Sandbox Code Playgroud)
我阅读了一些关于在 Scala 中使用下划线的解释,但没有一个提到我的情况
我有可选列表,例如:
val optionalEmptyList = Option(List[String]())
val optionalNonEmptyList = Option(List[String]("1","2"))
我想用 None 替换可选的空列表,同时保持可选的非空列表原样。
我想出了以下解决方案:
optionalEmptyList.flatMap(l => if (l.isEmpty) None else Option(l))
optionalNonEmptyList.flatMap(l => if (l.isEmpty) None else Option(l))
它有效,但似乎令人费解。有没有更简单的解决方案?
考虑以下示例:
trait Supe {
type Out <: Supe
def out: Out
}
class Reif1 extends Supe {
type Out = Reif1
override def out: Out = this
}
class Reif2 extends Supe {
type Out >: this.type <: Reif2
override def out: Out = this
}
Run Code Online (Sandbox Code Playgroud)
class Reif1显然应该工作。astype Out被具体化并成为类型别名
class Reif2也有效,但认真吗?type Out仅定义了上限/下限,并且边界甚至不够紧密:this.type是单例类型,并且Reif2是类类型。那么Out如果Reif2被实例化会是什么样子呢?它会是this.type吗?或者Reif2?但更大的问题应该是:为什么 scalac 2.12/2.13 允许编译它?
我知道,一般来说,关于决定要建模什么效果,有很多话要说。这个讨论是在 Scala 函数式编程中关于 IO 的章节中介绍的。
\n尽管如此,我还没有读完这一章,我只是从头到尾地浏览了一遍,然后才和 Cats IO 一起阅读。
\n与此同时,我在工作中遇到了一些需要很快交付的代码的情况。\n它依赖于一个与突变有关的 Java 库。该库是很久以前开始的,由于遗留原因,我没有看到它们发生变化。
\n无论如何,长话短说。实际上,将任何变异函数建模为 IO 是封装变异 Java 库的可行方法吗?
\n准备好建立一个模型,改变模型而不是创建一个新模型。例如,我会将 jena 与 gremlin 进行对比,gremlin 是一个基于图形数据的功能库。
\ndef loadModel(paths: String*): Model =\n paths.foldLeft(ModelFactory.createOntologyModel(new OntModelSpec(OntModelSpec.OWL_MEM)).asInstanceOf[Model]) {\n case (model, path) \xe2\x87\x92\n val input = getClass.getClassLoader.getResourceAsStream(path)\n val lang = RDFLanguages.filenameToLang(path).getName\n model.read(input, "", lang)\n }\nRun Code Online (Sandbox Code Playgroud)\n那是我的 scala 代码,但是网站中记录的 java api 看起来像这样。
\n// create the resource\nResource r = model.createResource();\n\n// add the property\nr.addProperty(RDFS.label, model.createLiteral("chat", "en"))\n .addProperty(RDFS.label, model.createLiteral("chat", "fr"))\n .addProperty(RDFS.label, model.createLiteral("<em>chat</em>", true));\n\n// …Run Code Online (Sandbox Code Playgroud) 我有一个案例课
case class InputCriteria(a: Int) {
val b: Int = config.getInt("some path")
}
Run Code Online (Sandbox Code Playgroud)
如何模拟这个案例类并覆盖 b 的值?
我有一个方法,需要以一年(int)作为参数。根据传入的年份,我需要分配一个变量,然后在查询中使用该变量:
def findByYear (year: Int): Future[Int] = {
val tableName = ""
year match {
case 1970 => tableName = "table1970" //this errors out
case 1980 => tableName = "table1980" //this errors out
}
config.db.run {
sqlu"SELECT count(*) from #${tableName}"
}
}
Run Code Online (Sandbox Code Playgroud)
由于scala不允许重新分配,因此出现了以上错误。有没有更好的方法来执行此操作,而不是将config.db.run子句放在每个子句中,case后者将成为非常重复的代码?
根据理解,模式匹配不起作用。
我在课本“ Scala中编程”中阅读了模式匹配的概念。
我有一个模式匹配的定义,如下所示。
def checkMe (a:Any) = a match {
case Int => "I am an Integer"
case Double => "I am a Double"
case Char => "I am a Charecter"
case _ => "I am something else"
}
Run Code Online (Sandbox Code Playgroud)
无论我在调用该函数时传递了什么,总是执行默认情况。
例如:checkMa(100)给出“我是别的东西” checkMe(10。)也给出“我是别的东西”等。
有人可以帮我理解定义中的错误吗。
我希望定义根据我通过的类型执行。
下面的示例来自Akka的Hello World项目,可从此处给出的说明下载。
示例代码在AkkaQuickstart.scala文件中。Greeter和Printer类以及具有相同名称的对象都在com.example包下的同一文件中。
在Greeter类中,有两个import语句:
import Greeter._
import Printer._
Run Code Online (Sandbox Code Playgroud)
当所有这些对象都定义在同一包中的同一文件中时,为什么需要在Greeter类中导入Greeter和Printer?它们是必需的,因为如果删除了这些导入,则代码将无法编译。
此处有关导入的Scala文档规定如下:
“导入子句用于访问其他程序包中的成员(类,特征,函数等)。不需要访问子句来访问同一程序包的成员。” 但是在下面的代码中,即使所有类和对象都在同一包中,也需要导入。为什么需要导入?
同样,对于Printer类,有以下导入语句:
import Printer._
Run Code Online (Sandbox Code Playgroud)
对此主题的任何指导将不胜感激。
完整的示例代码如下:
//#full-example
package com.example
import akka.actor.{ Actor, ActorLogging, ActorRef, ActorSystem, Props }
//#greeter-companion
//#greeter-messages
object Greeter {
//#greeter-messages
def props(message: String, printerActor: ActorRef): Props = Props(new
Greeter(message, printerActor))
//#greeter-messages
final case class WhoToGreet(who: String)
case object Greet
}
//#greeter-messages
//#greeter-companion
//#greeter-actor
class Greeter(message: String, printerActor: ActorRef) extends Actor {
import Greeter._ //*why is import required here?*
import Printer._ //*why is import …Run Code Online (Sandbox Code Playgroud) 我试图理解我从下面的代码中获得的输出,它显示一些带有前缀的字母数字值@。我如何将其更改为("Hello,world"),("How,are,you")
Scala代码:
val words = List("Hello_world","How_are_you" )
val ww= words.map(line=>line.split("_"))
println(ww)
Run Code Online (Sandbox Code Playgroud)
输出
List([Ljava.lang.String;@7d4991ad, [Ljava.lang.String;@28d93b30)
Run Code Online (Sandbox Code Playgroud) scala ×10
akka ×1
apache-spark ×1
arrays ×1
cats-effect ×1
immutability ×1
import ×1
list ×1
logic ×1
optional ×1
println ×1
scala-cats ×1
scalamock ×1
scalatest ×1
singleton ×1