Вопрос о возврате в выражении ламба - PullRequest
0 голосов
/ 16 декабря 2018

Сначала вот мой код

fun <T> max(strings : List<T>, compare : (acc:T, nextElement : T) -> Boolean) : T {

     var s : T = strings[0]
     for (t in strings) {
     if(compare(s,t)) 
         s = t
     }

     return s
}

fun lookForAlice (people : ArrayList<out Person>) {  

     people.forEach{ if (it.name == "Alice") {println("Found"); return}}
}

fun main() {

    val ints : List<Int> = listOf(1,333,44,3333)
    println(max(ints, {a, b -> if(a < b) {return true}}))  // Error Here!!!     
}

Я знаю, что может быть 'return' в лямбда-выражении, но у меня есть ошибка в строке, которую я заметил .. Что в этом плохого ???

1 Ответ

0 голосов
/ 16 декабря 2018

Лямбда-выражения обычно не имеют явного оператора return.Вместо этого возвращаемое значение является просто результатом последнего (или единственного) выражения, поэтому вам просто нужно это:

{ a, b -> a < b }

Если вы действительно хотите явное return, вы должны квалифицировать его как этикетки .Kotlin автоматически создает один для вас;его имя - это функция, которую вы передаете лямбда:

{ a, b -> if (a < b) return@max true else return@max false }

Обратите внимание, что у вас должна быть деталь else;в противном случае, Kotlin не знает, что вернуть, если сравнение ложно.

Или потому, что if является выражением:

{ a, b -> return@max if (a < b) true else false }

... но конструкции if (x) true else falseобескуражен, потому что это эквивалентно просто x.

Немаркированный возврат всегда возвращается из включающей «правильной» функции, а не из лямбды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...