使用 Immutable 将字符串附加到数组
Append strings to array with Immutable
将字符串列表作为输入(其中一个可能是 None
)。我如何使用 Immutable Object
.
return 字符串数组
如果我用var
或者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
对象怎么办?
N.B.: 如果 list2
是 None
则 returning 数组不应该有任何 None
对象
问题2:
..如果 list1
和 list2
是 List[CustomClass]
其中 CustomClass
是
case class CustomClass(string:String)
你会怎么做?
问题3:
...如果我们用...使方法复杂化怎么办
case class CustomClass1(string1:String)
case class CustomClass2(string2:String)
显然 CustomClass1 和 CustomClass2 在它们的 class 中可能有一些其他参数,使它们彼此不同。该方法的签名将是:
def getArrayString( string: String
, list1: List[CustomClass1]
, list2: Option[List[CustomClass2]]
): Array[String]`
您可以使用 ::
将元素添加到列表中,以及 ++
将连接 2 个列表:
val ret = (string :: (list1 ++ list2.getOrElse(Nil))).toArray
更新版本:
val ret = (string :: (list1 ++ list2.getOrElse(Nil)).map(_.string)).toArray
每次看到Option
就觉得"fold?".
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)
将字符串列表作为输入(其中一个可能是 None
)。我如何使用 Immutable Object
.
如果我用var
或者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
对象怎么办?
N.B.: 如果 list2
是 None
则 returning 数组不应该有任何 None
对象
问题2:
..如果 list1
和 list2
是 List[CustomClass]
其中 CustomClass
是
case class CustomClass(string:String)
你会怎么做?
问题3: ...如果我们用...使方法复杂化怎么办
case class CustomClass1(string1:String)
case class CustomClass2(string2:String)
显然 CustomClass1 和 CustomClass2 在它们的 class 中可能有一些其他参数,使它们彼此不同。该方法的签名将是:
def getArrayString( string: String
, list1: List[CustomClass1]
, list2: Option[List[CustomClass2]]
): Array[String]`
您可以使用 ::
将元素添加到列表中,以及 ++
将连接 2 个列表:
val ret = (string :: (list1 ++ list2.getOrElse(Nil))).toArray
更新版本:
val ret = (string :: (list1 ++ list2.getOrElse(Nil)).map(_.string)).toArray
每次看到Option
就觉得"fold?".
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)