2016-07-07 50 views
1

我是scala的新手,只是創建了一些示例來更好地理解它。我似乎無法弄清楚這個問題 - 我在我的java程序中創建一個字符串列表,並在我的scala程序中使用這個列表。從java類讀取列表的scala代碼看起來像這樣。如何在scala中使用flatMap來分組一組「vals」

private val stringList : Seq[List] = x.getStringName //gets the list from my java program. 

的StringList的包含

["How", "Are", "You"]. 

我試圖找到一種方法將這些字符串添加到一個名爲A,B和C值,使他們能夠在一個論據以後傳遞給另一個函數。

val values = stringList.flatMap{ 
    case x if (!stringList.isEmpty) => 

     val a = /*should get the first string How*/ 
     val b = /*should get the second string Are*/ 
     val c = /*should get the third string You*/ 

    case _ => None 
} 

getCompleteString(a,b,c); 

但這不起作用。我給我一個錯誤說

"type mismatch; found : Unit required: scala.collection.GenTraversableOnce[?]" 

我不使用爲什麼會發生這種情況。有人能告訴我我在這裏做錯了什麼嗎?

如果代碼看起來很髒,我很抱歉,但我是初學者,仍然試圖理解語言。任何幫助表示讚賞。先謝謝你。

+0

你確定你的'stringList'的類型是'Seq [List]'?不應該是'List [String]'或'Seq [String]'或其他什麼?您可以刪除該類型並查看IDE告訴您的類型。 –

回答

1

有很多方法可以做到這一點:

val a = stringList(0) 
val b = stringList(1) 
val c = stringList(2) 

val (a, b, c) = stringList match { 
    case first :: second :: third :: _ => (first, second, third) 
    case _ => ("default for a", "default for b", "default for c") // default case.. 
} 

第一種方法是Java的雜交,通過索引,但你必須檢查元素都是存在的,例如非空或其他。

第二個是使用元組,一次分配多個值。如果列表中至少有3個元素(第一個case語句),那麼它們將被分配給(a,b,c)元組,然後可以使用a,b,c ...如果列表中少於3個元素,將使用默認值(0,0,0)。

我相信在Scala中有更多的方法來實現這一點。

+0

嗨@ insan-e謝謝你。如果不使用字符串,我使用對象列表,那麼我該如何做同樣的事情?你能不能提出一些建議? – Goldengirl

+0

它應該與任何類型的列表相同,因爲它是通用的List [T]。 :) –

+0

例如,所有case語句的返回類型必須是相同的,以便將其分配給tuple3。 –

相關問題