我試圖從SetScala中的型別中取出字串。但是,無論我嘗試什么,它都會Unit以回傳型別而不是string.
if (!validationMessages.isEmpty) {
dataTuple = (parsedJson.toString(), for (s <- validationMessages.toString()){
s.toString()
})
println(dataTuple)
}
else {
dataTuple = (parsedJson.toString(), "some string...")
}
基本上,我試圖回傳一個像(String, String). 我錯過了什么?
uj5u.com熱心網友回復:
塊的值是塊中最后一個運算式的值。在這種情況下,if零件的價值是
println(dataTuple)
該else部分的價值是
dataTuple = (parsedJson.toString(), "some string...")
這兩個運算式都回傳,Unit所以結果是Unit。
快速修復是dataTuple在每個分支中創建最后一條陳述句:
if (!validationMessages.isEmpty) {
dataTuple = (parsedJson.toString(), for (s <- validationMessages.toString()){
s.toString()
})
println(dataTuple)
dataTuple
} else {
dataTuple = (parsedJson.toString(), "some string...")
dataTuple
}
但也可以考慮這樣的事情作為一個更簡單的解決方案:
val msg =
if (validationMessages.nonEmpty) {
validationMessages.mkString(", ")
} else {
"some string"
}
(parsedJson.toString, msg)
這mkString是嘗試替換此代碼:
for (s <- validationMessages.toString()) {
s.toString()
}
此代碼似乎試圖通過組合所有驗證訊息來創建一個字串,但它實際上回傳了,Unit因為for沒有yield. mkString呼叫toString的每個元素,Set然后通過在每個元素之間放置“,”來創建一個字串。這似乎大致是想要的,并且應該很容易修改為實際要求。
uj5u.com熱心網友回復:
為什么代碼會這樣?
該代碼具有回傳型別Unit,因為這是if陳述句兩個分支的回傳型別。
該if分支結束println(dataTuple),回傳Unit。該else分支結尾dataTuple = ...,這是變數賦值,它回傳Unit。如果您希望它回傳存盤在 中的元組dataTuple,您只需添加dataTuple到末尾。
你可能想做什么?
(parsedJson.toString, validationMessages.mkString("[", ", ", "]"))
這將回傳一個元組,其中第parsedJson一個是字串,第二個是 的每個元素validationMessages,以任意順序(因為Set是無序的),從 開始[,, 在連續元素之間,]最后。
所以如果parsedJson是{"key1": "value1"}和validationMessages是Set("unexpected key: key1", "missing key: key0")這將回傳("{"key1":"value1"}",["unexpected key: key1", "missing key: key0"]。
如果你不想在你的開頭/結尾放置一些特殊的東西.mkString,你可以只使用中間引數(分隔符)來呼叫它。
如果validationMessages為空,則validationMessages.mkString("delimiter")回傳一個空字串,并validationMessages.mkString("start", "delimiter", "end")回傳"startend".
scala 的一大優點是你可以在一行中完成復雜的事情(只要你對這門語言足夠了解)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405122.html
標籤:
下一篇:回傳前更改串列值-scala
