Kotlin tem funções de iteração muito boas, como forEach
ou repeat
, mas não consigo fazer os operadores break
e continue
trabalharem com eles (locais e não locais):
repeat(5) {
break
}
(1..5).forEach {
continue@forEach
}
O objetivo é imitar os loops usuais com a sintaxe funcional o mais próximo possível. Isso era definitivamente possível em algumas versões mais antigas do Kotlin, mas tenho dificuldade em reproduzir a sintaxe.
O problema pode ser um bug com rótulos (M12), mas acho que o primeiro exemplo deve funcionar mesmo assim.
Parece-me que li algures sobre um truque / anotação especial, mas não consegui encontrar nenhuma referência sobre o assunto. Pode ser parecido com o seguinte:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
for (index in 0..times - 1) {
body(index)
}
}
continue@label
ebreak@label
), consulte a pergunta relacionada: stackoverflow.com/questions/34642868/…break
econtinue
para loops funcionais, ou se está procurando respostas alternativas que façam exatamente a mesma coisa. O primeiro parece ser o caso, porque você rejeitou o último.Respostas:
Edit :
De acordo com a documentação do Kotlin , é possível usar anotações.
Resposta Original :
Como você fornece um
(Int) -> Unit
, não pode interromper ele, pois o compilador não sabe que ele é usado em um loop.Você tem poucas opções:
Use um loop for regular:
Se o loop for o último código do método que
você pode usar
return
para sair do método (oureturn value
se não forunit
método).Use um método
Crie um método de método de repetição personalizado que retorna
Boolean
para continuar.fonte
break
econtinue
só funcionam em loops.forEach
,repeat
e todos os outros métodos são apenas isso: métodos e não loops. Yoav apresentadas algumas alternativas, masbreak
econtinue
não são apenas ment trabalho para métodos.continue@label
ebreak@label
), consulte a pergunta relacionada: stackoverflow.com/questions/34642868/…Isso imprimirá de 1 a 5. O
return@forEach
atua como a palavra-chavecontinue
em Java, o que significa que, neste caso, ele ainda executa todos os loops, mas pula para a próxima iteração se o valor for maior que 5.Isso imprimirá de 1 a 10, mas pula 5.
Experimente-os no Kotlin Playground .
fonte
continue
e umbreak
exemplo: pl.kotl.in/_LAvET-wXUma pausa pode ser alcançada usando:
E um continuar pode ser alcançado com:
Como qualquer um aqui recomenda ... leia os documentos: P https://kotlinlang.org/docs/reference/returns.html#return-at-labels
fonte
@loop
dá o mesmo resultado desejado.Você pode usar o retorno da expressão lambda que imita um
continue
oubreak
dependendo do seu uso.Isso é abordado na pergunta relacionada: Como faço uma "pausa" ou "continuo" quando em um loop funcional dentro do Kotlin?
fonte
Como diz a documentação do Kotlin , usando
return
é o caminho a seguir. O bom do kotlin é que, se você tiver funções aninhadas, poderá usar rótulos para escrever explicitamente de onde vem o seu retorno:Retorno do Escopo da Função
e Retorno Local (não para de passar por forEach = continuation)
Confira a documentação, é muito bom :)
fonte
forEach
continue
tipo de comportamento emforEach
para o
break
tipo de comportamento que você tem que usarfor in until
oufor in
conforme a lista éNullable
ouNon-Nullable
Para lista anulável :
Para lista não anulável :
fonte
Instrução Break para loops aninhados forEach ():
Resultado:
Continue a declaração com função anônima:
Resultado:
fonte
talvez mude para cada para
funciona para hashmaps
fonte