2016-07-07 3 views
1

Я новичок в scala и просто создал несколько примеров, чтобы понять их лучше. Я не могу понять эту проблему здесь: я создаю список строк в моей java-программе и использую этот список в своей программе scala. Мой scala-код для чтения списка из класса java выглядит примерно так.Как использовать flatMap в scala, чтобы сгруппировать набор «vals»

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

StringList содержит

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

Я пытаюсь найти способ, чтобы добавить эти строки до значений, называемых а, Ь и с тем, чтобы они могли быть впоследствии переданы через аргументы другой функции ,

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 спасибо за это. Если вместо использования String я использую список объектов, то как мне сделать то же самое? Могли бы вы быть любезными, чтобы что-то предложить? – Goldengirl

+0

Он должен быть одинаковым для любого типа List, так как он является общим, List [T]. :) –

+0

Тип возврата из всех операторов case ДОЛЖЕН быть таким же, чтобы, например, назначить его tuple3. –

Смежные вопросы