如何在Scala中将对象从Vector添加到ListBuffer?

时间:2016-06-06 17:23:00

标签: scala playframework functional-programming playframework-2.2

我无法在控制台上打印newPStat List的元素,执行以下简单转换后, 它该死的简单而且我仍然缺少一些非常微不足道的东西。

...
val newPStat = List[PSObject]()

S1ServiceObject.getPS.onComplete({
        case Success(pSList) => {
          logger.info("Number of Ps - " + pSList.size)
            pSList.foreach{
              pfS => {
              newPStat ++ List(new PSObject(pfS.pfNameRemote, pfS.impRemote,
                  pfS.actCRemote, pfS.actARemote) )
                println("prx Size "+newPStat.size)
              }
            }
          }
        case Failure(exception) => {
          logger.error("Error while trying to get PS  - " + exception.getMessage)
        }
      })


case class PSObject(pfName: String, imp : BigDecimal, actC: Int, actA: Int)

// printing the object's elements

newPStat.foreach{x => println("prax: "+x.toString)}

正如您可以看到上面的函数调用
跟随Function,这是一个服务层Func。返回Future [Vector []]

def getPS: Future[Vector[PSObjectDTO]]= {
    getPSData
  }

1 个答案:

答案 0 :(得分:1)

您永远不会真正更改newPStat列表。这条线实际上什么也没做:

newPStat ++ List(new PSObject(pfS.pfNameRemote, pfS.impRemote, pfS.actCRemote, pfS.actARemote) )

您正在创建一个新列表但从未将其分配给任何内容,如此REPL示例所示:

scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)

scala> a ++ List(4)
res9: List[Int] = List(1, 2, 3, 4)

scala> a
res10: List[Int] = List(1, 2, 3)

因此,您需要将newPStatval更改为var并将其重新分配到新列表:

newPStat = newPStat ++ List(new PSObject(pfS.pfNameRemote, pfS.impRemote, pfS.actCRemote, pfS.actARemote) )

此外,由于您正在动态构建列表,我建议您推荐一个ArrayBuffer

scala> val a = collection.mutable.ArrayBuffer.empty[Int]
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

scala> a.append(1)

scala> a.append(2)

scala> a.toArray
res13: Array[Int] = Array(1, 2)

更惯用的方法是使用map代替foreach

newPStat = pSList.map{pfS => new PSObject(pfS.pfNameRemote, pfS.impRemote, pfS.actCRemote, pfS.actARemote)}.toList