0

将 String 列表作为输入(其中之一可能是None)。如何使用Immutable Object.

var如果我使用or ,这很容易Mutable Object,这里有一个例子:

def getArrayString(string: String, list1: List[String], list2: Option[List[String]]): Array[String] = {
  var ret = Array[String]()
  ret = ret :+ string
  if (list1.nonEmpty) {
    for (item <- list1) {
      ret = ret :+ item
    }
  }
  if (list2.isDefined) {
    for (item <- list2.get) {
      ret = ret :+ item
    }
  }
  ret
}

问题1:如果我只想使用val对象怎么办?

注意:如果list2None返回数组不应该有任何None对象

Question2 : ..and iflist1andlist2wereList[CustomClass]whereCustomClassis

case class CustomClass(string:String)

你会怎么做?

问题3:......如果我们用......使方法复杂化怎么办?

case class CustomClass1(string1:String)

case class CustomClass2(string2:String)

显然 CustomClass1 和 CustomClass2 可能在它们的类中有一些其他参数,使它们彼此不同。该方法的签名将是:

def getArrayString( string: String
                , list1: List[CustomClass1]
                , list2: Option[List[CustomClass2]]
              ): Array[String]`
4

2 回答 2

1

每次看到Option我都会想“弃牌?”。

def getArrayString( string: String
                  , list1: List[String]
                  , list2: Option[List[String]]
                  ): Array[String] =
  list2.foldLeft(string +: list1)(_++_).toArray

更新(按要求)

case class CustomClass(string:String)
def getArrayString( string: String
                    , list1: List[CustomClass]
                    , list2: Option[List[CustomClass]]
                  ): Array[String] =
  string +: list2.foldLeft(list1)(_++_).map(_.string).toArray

或者稍微简洁一点:

  Array(string) ++ (list1 /: list2)(_++_).map(_.string)
于 2017-01-10T16:39:29.417 回答
1

您可以使用::which 将元素添加到列表中,++并将连接 2 个列表:

val ret = (string :: (list1 ++ list2.getOrElse(Nil))).toArray

对于更新版本:

val ret = (string :: (list1 ++ list2.getOrElse(Nil)).map(_.string)).toArray
于 2017-01-10T15:56:41.843 回答