如何将列表连接到scala中的另一个列表

时间:2013-12-11 06:36:23

标签: list scala concatenation scala-java-interop

在这里,我使用 :+

来连接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"
}

连接代码错了?

请分享您的答案

4 个答案:

答案 0 :(得分:5)

您应该查看您正在调用的:+方法的API文档。

我不确定哪个Scala集合类型java.util.List被隐式转换为,但我认为:+方法在任何地方都是相同的:http://www.scala-lang.org/api/current/#scala.collection.Seq

java.util.List implicitly convertedscala.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。)