我正在将一些Elasticsearch Java API转换为Scala。Java中有一些采用类型为变量的方法String... indices,因此我试图为Scala函数提供类型为变量的函数,该函数indices: String*封装了该Java方法。我没有找到转换String*为的方法String...。
我感谢您的帮助。
如果我有一个这样的案例类:
case class Foo(s : String, k : Int)
Run Code Online (Sandbox Code Playgroud)
如何为此指定一个空的构造函数?我需要这个的原因是因为我想将这个类的值传递给一个 Java API,它要求该类有一个空的构造函数。我是否为此指定默认值?我想我必须这样做,我别无选择。
我已经A在 Scala 中定义了这个类:
class A(var number: Int)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试number在 java 中访问其成员字段时,出现错误:
A a = new A();
a.number = 4;
Run Code Online (Sandbox Code Playgroud)
结果:java: number has private access in A。如果我尝试number从 Scala访问,则没有问题。
我该怎么做才能解决这个问题?
想象一下我有一个Java列表
val javaList: java.util.List[String] = null
Run Code Online (Sandbox Code Playgroud)
如果我想将其用作scala集合,比如说Buffer,我只需添加以下导入(如之前多次描述)
import scala.collection.JavaConversions._
Run Code Online (Sandbox Code Playgroud)
问题是我必须检查列表是否不同于null。这将不起作用:
javaList foreach println //throws java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以将java列表转换为scala集合,从而将null转换为Buffer.empty?与Option工厂相似:
Option(null) //> res0: Option[Null] = None
asScalaBuffer(javaList) // I wish this to be ArrayBuffer()
Run Code Online (Sandbox Code Playgroud) 在这里,我用来连接2个列表(使用相同的类型) :+
代码是 testResult:+ studentsearch
列表的长度在控制台中获得零值
调节器
@RequestMapping(value = Array("parent/ViewReports.html"))
def viewReportPage(test: Test): String = {
var userAccount: UserAccount = secService.getLoggedUserAccount
var z = userAccount.getId().toLong
var studentsearch: java.util.List[StudentTest] = Nil
var studentTestResult: java.util.List[StudentTest] =Nil
var testResult: java.util.List[StudentTest] =Nil
var searchstudent = parentStudentService.findParentStudentByParent(z)
for(srchStd <- searchstudent){
var sid= srchStd.getStudent().getId()
studentsearch = studentTestService.findAllStudentTestByStudent(sid)
}
testResult :+ studentsearch
println("Length:" +testResult.length)
studentTestResult = ListBuffer(testResult: _*) .
results = studentTestResult
"redirect:/parent/result.html"
}
Run Code Online (Sandbox Code Playgroud)
连接代码是错误的?
请分享你的答案
当我尝试包含scala jar在我的java server应用程序中时,我收到错误
java.lang.NoClassDefFoundError: scala/ScalaObject
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
Run Code Online (Sandbox Code Playgroud)
这意味着我需要将其包含scala-library.jar在我的CLASSPATH
sbt 构建过程中是否有任何方法可以将其包含在targetjar 中。
我导入了这个:
import scala.collection.JavaConversions._
val size: Int = blubb.getSize
var fields: ArrayBuffer[Field] = new ArrayBuffer[Field]
size match
{
case 1 => fields.append(field)
case 2 => fields = field.getNeighbours)
}
Run Code Online (Sandbox Code Playgroud)
现在getNeighbours返回一个java.util.ArrayList而不是一个ArrayBuffer(它是一个我无法控制的Java类).
编译说
ArrayList [Field]类型的表达式不符合预期类型ArrayBuffer [Field]
JavaConversions不应该处理这个吗?如何轻松地将ArrayList转换为ArrayBuffer?(我不想在Scala代码中用ArrayList替换ArrayBuffer!)