1

私はscalaが初めてで、理解を深めるためにいくつかの例を作成していました. ここでこの問題を理解できないようです.Javaプログラムで文字列のリストを作成し、このリストをscalaプログラムで使用しています. Java クラスからリストを読み取るための私の scala コードは、次のようになります。

  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[?]"

なぜこれが起こるのかわかりません。誰かが私がここで間違っていることを教えてもらえますか?

コードが汚く見える場合は申し訳ありませんが、私は初心者であり、まだ言語を理解しようとしています。どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

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 風ですが、要素が存在するかどうか、たとえば not-null かどうかを確認する必要があります。

2 つ目は、一度に複数の値を割り当てるタプルを使用する方法です。リストに少なくとも 3 つの要素がある場合 (最初の case ステートメント)、それらは (a,b,c) タプルに割り当てられ、a,b,c を使用できます... リストに 3 つ未満の要素がある場合、デフォルト値が使用されます (0,0,0)。

Scala でこれを実現する方法は他にもあると確信しています。

于 2016-07-07T10:59:22.080 に答える