我對 Scala 和函式式編程很陌生。我撰寫了如下的簡單代碼,它通過計算單詞來操作字串。當第 4 個逗號分隔的部分為空時,我只連接了三列,否則我連接了所有列,包括上面代碼中的值。
但我認為它不太適合函式式編程。因為我用if陳述句來查看輸入值是否包含值。
如何將其更改為更類似于 scala 的代碼?
str = "aa,bb,1668268540040,34.0::aa,bb,1668268540040"
val parts = str.split("::")
for (case <- parts) {
val ret = case.map(c => if (c.value.isEmpty) {
c.columnFamily "," c.qualifier "," c.ts
} else {
c.columnFamily "," c.qualifier "," c.ts "," c.value
})
}
str = "aa,bb,1668268540040,34.0::aa,bb,166826434343"
val parts = str.split("::")
for (part <- parts) {
val elem = part.split(",", 4)
if (elem.length == 4) {
val Array(f, q, t, v) = elem
state.put(f ":" q, (v, t.toLong))
} else {
val Array(f, q, t) = elem
state.put(f ":" q, ("", t.toLong))
}
}
uj5u.com熱心網友回復:
@LeviRamsey 的評論實際上告訴你一切,但只是為了讓你的代碼更“scala-ish”,你應該首先避免可變資料結構(你對狀態所做的事情,我認為它是一個 Map 物件),并且使用不可變的資料結構。就您if-else
而言,在 FP 中實際上沒問題,但在 Scala 中,您可以在串列上使用模式匹配,而不是手動檢查長度并使用Arrays
. 像這樣的東西:
parts.foldLeft(Map.empty[String, (String, Long)]) {
case (state, part) =>
part.split(",", 4).toList match {
case f :: q :: t :: v :: Nil =>
state.updated(f ":" q, (v, t.toLong))
case f :: q :: t :: Nil =>
state.updated(f ":" q, ("", t.toLong))
case _ => state // or whatever thing you want to do, in case neither 4 nor 3 elements are splitted
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/532050.html
標籤:斯卡拉