Eu posso "voltar mais cedo" dentro de um Runnable?

votos
0

Dentro de um Runnablebloco, eu quero fazer algum bloco de guarda, assim:

var condition: String? = null
Runnable {
    if (condition == null) return
    // do something
}

mas compilador diz retorno não é permitido aqui ??

Publicado 08/11/2018 em 06:54
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Há duas maneiras que você pode fazer este trabalho:

Como mencionado nos comentários, você pode usar um "retorno qualificado", como discutido aqui . Isso é também o que IntelliJ (AndroidStudio bem eu acho) sugere: digite descrição da imagem aqui

Como alternativa, você pode definir seu Runnablecomo uma classe anônima que permite que você use comuns returndeclarações:

 object: Runnable {
     override fun run() {
         if (condition == null) return
         // do something
     }
 }

IntelliJ agora irá sugerir para transformar este objecta um lambda que irá resultar em exatamente a mesma coisa com um qualificado return:

Runnable {
    if (condition == null) return@Runnable
    // do something
}

PS: Não há necessidade de se sentir burra! Suponho que teria encontrado facilmente com a redacção direita. É bom saber o que Runnable {}está aqui. É basicamente um lambda que se baseia na conversão SAM (funciona com tipos de Java com um método abstrato single)

Respondeu 08/11/2018 em 07:39
fonte usuário

votos
0

Para expandir a resposta de s1m0nw1, usando return@Runnableestá correto.

@Runnableé, neste caso, definindo o que você voltar. Ele também funciona com loops, mas também métodos. Aqui está um exemplo com loops:

fun test(){
    one@for(i in 0..100){
        two@for(j in 0..i){
            if(j == 20){
                break;//this breaks two
            }
        }
    }
}

Este exemplo divide o segundo quando j == 20. Se você quer quebrar o laço externo quando j é de 20 (isso pode não ser o melhor exemplo, mas você ainda obter a idéia geral), você usaria break@one. Para loops, isto só funciona se você declarar explicitamente um rótulo.

Você basicamente tem que especificar o que você quer quebrar / retorno / continuar (dependendo do que você usar) em alguns casos. Retornando de um método regular, ou quebrar um único laço não precisa de rotulagem explícita, mas se você usar lambda, ou quer quebrar alças mais exteriores, você teria como alvo aqueles que utilizam [return/break/continue]@LabelMethodClassOrInterfaceName.

No exemplo acrescentei, se você quiser retornar ao invés de pausa, você poderia usar return@test. No entanto, é um pouco inútil, uma vez returnnesse contexto implica a partir do método.

Com este tipo de lambda, você é forçado a usar return@InterfaceName. InterfaceNameé substituído com qualquer interface que você está usando (neste caso Runnable).

Ou você pode, naturalmente, obter IntelliJ para auto-completar isso para você.

Respondeu 08/11/2018 em 10:04
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more