2016-06-03 2 views
0

Почему у вас не может быть оператора case внутри лямбда-функции? Мой код выглядит примерно какscala с выражением случая внутри лямбда

def f(list:List[String]):List[Int] = list.map(_ match{ case _.length > 1 => _.length else 1}) 

input 
"mike" 
"tom" 
"t" 
" " 

output 
4 
3 
1 
1 

Как вы можете видеть, я пытаюсь сделать корпус внутри лямбда. Я пробовал так много способов с синтаксисом.

+1

Каковы ваши 3 подстановочные знаки ('_'), которые должны быть? Тот же параметр? 3 разных параметра? Почему вы используете 'match' вместо' if', если у вас есть только две возможности, и вы не соответствуете шаблонам? –

+0

Возможно, если бы вы могли написать код, который вы хотите в полной функции, будет более понятным, что вы хотите сделать лямбда. –

ответ

8

Вы, кажется, пытаетесь использовать оговорку охраны , и вы можете посмотреть на a tutorial on match statements.

Однако, то, что вы делаете, вовсе не требует утверждения соответствия.

list.map(x => math.max(1, x.length)) 

Или, если max не существует, и мы не хотели называть x.length дважды, мы могли бы назначить переменную:

list.map{ x => 
    val len = x.length 
    if (len > 1) len else 1 
} 

Или мы можем использовать оператор матча, либо с оговорка охранник или голый:

list.map(_.length match { case x if x > 1 => x; case _ => 1 }) 
list.map(_.length match { case x => if (x > 1) x else 1 }) 

Обратите внимание, что _ является не переменная. Вы не можете использовать его повторно. Это означает, что «игнорируйте это», «сделайте это функцией», «введите любую следующую переменную». Если вам нужна переменная, на которую вы можете ссылаться повторно, вы должны ее назвать (например, x).

Следует также отметить, что else является не a «если нет» альтернатива case заявлений. Если вы хотите использовать команду catch-whatever-остатки по умолчанию (и вы должны!), Используйте case _ =>.

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