在这里,我使用 :+
来连接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"
}
连接代码错了?
请分享您的答案
答案 0 :(得分:5)
您应该查看您正在调用的:+
方法的API文档。
我不确定哪个Scala集合类型 java.util.List
被隐式转换为,但我认为:+
方法在任何地方都是相同的:http://www.scala-lang.org/api/current/#scala.collection.Seq
java.util.List
implicitly converted至scala.collection.mutable.Buffer
。
此序列的副本,附加了一个元素。
换句话说,:+
不会修改集合,因此语句TestResult :+ studentsearch
无效。
您可以直接调用Java集合的方法:TestResult addAll studentsearch
。
虽然,请问,为什么使用java.util.List
而不是Scala集合?
当然,我还应该注意,在Scala中,就像在Java中一样,用大写字母开始一个变量名称是非常不满的。 (testResult
,而非TestResult
)。它在Scala中更为重要,因为变量和类型共享相同的命名空间,与Java不同。
答案 1 :(得分:4)
您的代码以有趣的方式使用scala结构。这可能不会导致正确的结果。
中的理解for(srchStd <- searchstudent){
var sid= srchStd.getStudent().getId()
studentsearch = studentTestService.findAllStudentTestByStudent(sid)
}
在每次迭代中将studentsearch
重新分配给一个新值,因此最后它被设置为最后一次迭代的值。如果你想积累像
import scala.collection.JavaConversions._
val searchstudent = parentStudentService.findParentStudentByParent(z)
val testResult = searchstudent.flatMap{ srchStd =>
val sid = srchStd.getStudent().getId()
studentTestService.findAllStudentTestByStudent(sid)
}
将导致在testResult
收集所有测试。
导入scala.collection.JavaConversions._
有助于在scala和java集合之间进行转换。可以在此处找到更多信息:http://www.scala-lang.org/api/current/index.html#scala.collection.JavaConversions$。
答案 2 :(得分:3)
您可能希望查看Scala标准库中的JavaConversions对象,该对象允许您在Scala类型和Java集合之间进行迁移。文档中的内容支持以下转换:
scala.collection.Iterable <=> java.lang.Iterable
scala.collection.Iterable <=> java.util.Collection
scala.collection.Iterator <=> java.util.{ Iterator, Enumeration }
scala.collection.mutable.Buffer <=> java.util.List
scala.collection.mutable.Set <=> java.util.Set
scala.collection.mutable.Map <=> java.util.{ Map, Dictionary }
scala.collection.mutable.ConcurrentMap (deprecated since 2.10) <=> java.util.concurrent.ConcurrentMap
scala.collection.concurrent.Map <=> java.util.concurrent.ConcurrentMap
您应该考虑在Scala中本地创建/填充集合的情况下使用本机Scala集合(List,Seq等...),而不是通过拨打现有的Java代码块来生成。 / p>
希望这有帮助
答案 3 :(得分:3)
为了完整性,用于将列表连接到另一个列表的运算符是++=
。虽然接受的答案指出,但在这种情况下最好使用flatMap
。 (您也可以使用for..yield
。)