ventajas tutorial kotlin

tutorial - Regreso de las lambdas o Kotlin: "retorno" no está permitido aquí



kotlin vs java (2)

No puede hacer una devolución no local dentro de un lambda pero puede cambiar su lambda a una función anónima:

fun String.isNice(): Boolean { val hasRepeat = fun(): Boolean { for (i in 0..(length - 2)) { if (subSequence(i, i + 2).toSet().size == 1) { return true } } return false } return hasRepeat() }

Estoy tratando de escribir una función que me diga que la cadena es buena, buena significa que la cadena tiene al menos una repetición de letras en la cadena. Pero no puedo hacer un retorno de lambda, siempre se devuelve falso, aunque se cumpla la condición de la declaración. ¿Alguien me puede explicar cómo hacer volver?

He intentado escribir el retorno, pero IDEA me dio el mensaje Kotlin: "retorno" no está permitido aquí

fun main(args: Array<String>) { println("sddfsdf".isNice()) } fun String.isNice(): Boolean { val hasRepeat = { for (i in 0 .. (length - 2)) { if (subSequence(i, i + 2).toSet().size == 1) { true println(subSequence(i, i + 2)) } } false } return hasRepeat() }

ouput es:

dd false


Puede etiquetar lambda y luego usar la devolución etiquetada:

fun String.isNice(): Boolean { val hasRepeat = hasRepeat@ { for (i in 0 .. (length - 2)) { if (subSequence(i, i + 2).toSet().size == 1) { return@hasRepeat true println(subSequence(i, i + 2)) // <-- note that this line is unreachable } } false } return hasRepeat() }

o puede usar una función local nombrada, si no necesita que hasRepeat sea ​​una referencia de función:

fun String.isNice(): Boolean { fun hasRepeat(): Boolean { for (i in 0 .. (length - 2)) { if (subSequence(i, i + 2).toSet().size == 1) { return true } } return false } return hasRepeat() }