Este codelab faz parte do curso de treinamento do Kotlin para programadores. Você vai aproveitar mais este curso se fizer os codelabs em sequência. Dependendo do seu conhecimento, talvez você possa passar mais rápido por algumas seções. Este curso é destinado a programadores que conhecem uma linguagem orientada a objetos e querem aprender Kotlin.
Introdução
Neste codelab, você vai criar um programa em Kotlin e aprender sobre funções nessa linguagem, incluindo valores padrão para parâmetros, filtros, lambdas e funções compactas.
Em vez de criar um único app de exemplo, as lições deste curso foram criadas para aumentar seu conhecimento, mas são semi-independentes umas das outras para que você possa ler as seções com que já está familiarizado. Para unificar os exemplos, muitos deles usam um tema de aquário. Se quiser conferir a história completa do aquário, acesse o curso da Udacity Treinamento do Kotlin para programadores (link em inglês).
O que você já precisa saber
- Os conceitos básicos de uma linguagem de programação moderna, orientada a objetos e com tipagem estática
- Como programar com classes, métodos e tratamento de exceções em pelo menos uma linguagem
- Como trabalhar com o REPL (Read-Eval-Print Loop) do Kotlin no IntelliJ IDEA
- Os conceitos básicos do Kotlin, incluindo tipos, operadores e loops
Este codelab é destinado a programadores que conhecem uma linguagem orientada a objetos e querem aprender mais sobre Kotlin.
O que você vai aprender
- Como criar um programa com uma função
main()e argumentos no IntelliJ IDEA - Como usar valores padrão e funções compactas
- Como aplicar filtros a listas
- Como criar lambdas básicos e funções de ordem superior
Atividades deste laboratório
- Trabalhe com o REPL para testar alguns códigos.
- Trabalhar com o IntelliJ IDEA para criar programas básicos em Kotlin.
Nesta tarefa, você vai criar um programa em Kotlin e aprender sobre a função main(), além de como transmitir argumentos para um programa na linha de comando.
Você deve se lembrar da função printHello() que inseriu no REPL em um codelab anterior:
fun printHello() {
println ("Hello World")
}
printHello()⇒ Hello World
Você define funções usando a palavra-chave fun, seguida pelo nome da função. Assim como em outras linguagens de programação, os parênteses () são para argumentos de função, se houver. As chaves {} enquadram o código da função. Não há tipo de retorno para essa função, porque ela não retorna nada.
Etapa 1: criar um arquivo Kotlin
- Abra o IntelliJ IDEA.
- O painel Project à esquerda no IntelliJ IDEA mostra uma lista dos arquivos e pastas do projeto. Encontre e clique com o botão direito do mouse na pasta src em Hello Kotlin. (Você já deve ter o projeto Hello Kotlin do codelab anterior.)
- Selecione New > Kotlin File / Class.
- Mantenha Tipo como Arquivo e nomeie o arquivo como Hello.
- Clique em OK.
Agora há um arquivo na pasta src chamado Hello.kt.

Etapa 2: adicionar código e executar o programa
- Assim como em outras linguagens, a função
main()do Kotlin especifica o ponto de entrada para execução. Todos os argumentos de linha de comando são transmitidos como uma matriz de strings.
Digite ou cole o seguinte código no arquivo Hello.kt :
fun main(args: Array<String>) {
println("Hello, world!")
}Assim como a função printHello() anterior, essa função não tem uma instrução return. Toda função em Kotlin retorna algo, mesmo quando nada é especificado explicitamente. Portanto, uma função como esta main() retorna um tipo kotlin.Unit, que é a maneira do Kotlin de dizer que não há valor.
- Para executar o programa, clique no triângulo verde à esquerda da função
main(). Selecione Executar "HelloKt" no menu. - O IntelliJ IDEA compila e executa o programa. Os resultados aparecem em um painel de registro na parte de baixo, como mostrado abaixo.

Etapa 3: transmitir argumentos para main()
Como você está executando o programa no IntelliJ IDEA e não na linha de comando, é necessário especificar os argumentos de maneira um pouco diferente.
- Selecione Run > Edit Configurations. A janela Executar/depurar configurações é aberta.
- Digite
Kotlin!no campo Argumentos do programa. - Clique em OK.

Etapa 4: mudar o código para usar um modelo de string
Um modelo de string insere uma variável ou expressão em uma string, e $ especifica que parte da string será uma variável ou expressão. As chaves {} enquadram a expressão, se houver.
- Em Hello.kt, mude a mensagem de boas-vindas para usar o primeiro argumento transmitido ao programa,
args[0], em vez de"world".
fun main(args: Array<String>) {
println("Hello, ${args[0]}")
}- Execute o programa. A saída vai incluir o argumento especificado.
⇒ Hello, Kotlin!
Nesta tarefa, você vai aprender por que quase tudo em Kotlin tem um valor e por que isso é útil.
Algumas outras linguagens têm instruções, que são linhas de código sem um valor. Em Kotlin, quase tudo é uma expressão e tem um valor, mesmo que esse valor seja kotlin.Unit.
- Em Hello.kt, escreva um código em
main()para atribuir umprintln()a uma variável chamadaisUnite imprima-o. (println()não retorna um valor, então retornakotlin.Unit.)
// Will assign kotlin.Unit
val isUnit = println("This is an expression")
println(isUnit)- Execute o programa. O primeiro
println()imprime a string"This is an expression". O segundoprintln()imprime o valor da primeira instruçãoprintln(), ou seja,kotlin.Unit.
⇒ This is an expression kotlin.Unit
- Declare um
valchamadotemperaturee inicialize-o como 10. - Declare outro
valchamadoisHote atribua o valor de retorno de uma instruçãoif/elseaisHot, conforme mostrado no código a seguir. Como é uma expressão, você pode usar o valor da expressãoifimediatamente.
val temperature = 10
val isHot = if (temperature > 50) true else false
println(isHot)⇒ false
- Use o valor de uma expressão em um modelo de string. Adicione um código para verificar a temperatura e determinar se um peixe está seguro ou muito quente. Em seguida, execute o programa.
val temperature = 10
val message = "The water temperature is ${ if (temperature > 50) "too warm" else "OK" }."
println(message)⇒ The water temperature is OK.
Nesta tarefa, você vai aprender mais sobre funções no Kotlin e sobre a expressão condicional when, que é muito útil.
Etapa 1: criar algumas funções
Nesta etapa, você vai juntar parte do que aprendeu e criar funções com diferentes tipos. Substitua o conteúdo de Hello.kt por esse novo código.
- Escreva uma função chamada
feedTheFish()que chamarandomDay()para receber um dia aleatório da semana. Use um modelo de string para imprimir umfoodpara o peixe comer naquele dia. Por enquanto, os peixes comem a mesma coisa todos os dias.
fun feedTheFish() {
val day = randomDay()
val food = "pellets"
println ("Today is $day and the fish eat $food")
}
fun main(args: Array<String>) {
feedTheFish()
}- Escreva a função
randomDay()para escolher um dia aleatório de uma matriz e retorná-lo.
A função nextInt() usa um limite inteiro, que limita o número de Random() a 0 por 6 para corresponder à matriz week.
fun randomDay() : String {
val week = arrayOf ("Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday")
return week[Random().nextInt(week.size)]
}- As funções
Random()enextInt()são definidas emjava.util.*. Na parte de cima do arquivo, adicione a importação necessária:
import java.util.* // required import- Execute o programa e verifique a saída.
⇒ Today is Tuesday and the fish eat pellets
Etapa 2: usar uma expressão when
Para ir além, mude o código para escolher alimentos diferentes para dias diferentes usando uma expressão when. A instrução when é semelhante a switch em outras linguagens de programação, mas when é interrompida automaticamente no final de cada ramificação. Ele também garante que seu código cubra todas as ramificações se você estiver verificando uma enumeração.
- Em Hello.kt, adicione uma função chamada
fishFood()que usa um dia comoStringe retorna a comida do peixe para o dia comoString. Usewhen()para que cada dia o peixe receba um alimento específico. Execute o programa algumas vezes para ver saídas diferentes.
fun fishFood (day : String) : String {
var food = ""
when (day) {
"Monday" -> food = "flakes"
"Tuesday" -> food = "pellets"
"Wednesday" -> food = "redworms"
"Thursday" -> food = "granules"
"Friday" -> food = "mosquitoes"
"Saturday" -> food = "lettuce"
"Sunday" -> food = "plankton"
}
return food
}
fun feedTheFish() {
val day = randomDay()
val food = fishFood(day)
println ("Today is $day and the fish eat $food")
}⇒ Today is Thursday and the fish eat granules
- Adicione uma ramificação padrão à expressão
whenusandoelse. Para testar e garantir que o padrão seja usado às vezes no seu programa, remova as ramificaçõesTuesdayeSaturday.
Ter uma ramificação padrão garante quefoodreceba um valor antes de ser retornado, então não é mais necessário inicializá-lo. Como o código agora atribui uma string afoodapenas uma vez, é possível declararfoodcomvalem vez devar.
fun fishFood (day : String) : String {
val food : String
when (day) {
"Monday" -> food = "flakes"
"Wednesday" -> food = "redworms"
"Thursday" -> food = "granules"
"Friday" -> food = "mosquitoes"
"Sunday" -> food = "plankton"
else -> food = "nothing"
}
return food
}- Como toda expressão tem um valor, é possível deixar esse código um pouco mais conciso. Retorne o valor da expressão
whendiretamente e elimine a variávelfood. O valor da expressãowhené o valor da última expressão da ramificação que atendeu à condição.
fun fishFood (day : String) : String {
return when (day) {
"Monday" -> "flakes"
"Wednesday" -> "redworms"
"Thursday" -> "granules"
"Friday" -> "mosquitoes"
"Sunday" -> "plankton"
else -> "nothing"
}
}A versão final do programa vai ficar parecida com o código abaixo.
import java.util.* // required import
fun randomDay() : String {
val week = arrayOf ("Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday")
return week[Random().nextInt(week.size)]
}
fun fishFood (day : String) : String {
return when (day) {
"Monday" -> "flakes"
"Wednesday" -> "redworms"
"Thursday" -> "granules"
"Friday" -> "mosquitoes"
"Sunday" -> "plankton"
else -> "nothing"
}
}
fun feedTheFish() {
val day = randomDay()
val food = fishFood(day)
println ("Today is $day and the fish eat $food")
}
fun main(args: Array<String>) {
feedTheFish()
}Nesta tarefa, você vai aprender sobre os valores padrão de funções e métodos. Você também vai aprender sobre funções compactas, que podem tornar seu código mais conciso e legível, além de reduzir o número de caminhos de código para teste. As funções compactas também são chamadas de funções de expressão única.
Etapa 1: criar um valor padrão para um parâmetro
Em Kotlin, é possível transmitir argumentos pelo nome do parâmetro. Também é possível especificar valores padrão para parâmetros: se um argumento não for fornecido pelo autor da chamada, o valor padrão será usado. Mais tarde, ao escrever métodos (funções de membro), você evita escrever muitas versões de sobrecarga do mesmo método.
- Em Hello.kt, escreva uma função
swim()com um parâmetroStringchamadospeedque imprime a velocidade do peixe. O parâmetrospeedtem um valor padrão de"fast".
fun swim(speed: String = "fast") {
println("swimming $speed")
}- Na função
main(), chame a funçãoswim()de três maneiras. Primeiro, chame a função usando o padrão. Em seguida, chame a função e transmita o parâmetrospeedsem um nome. Depois, chame a função nomeando o parâmetrospeed.
swim() // uses default speed
swim("slow") // positional argument
swim(speed="turtle-like") // named parameter⇒ swimming fast swimming slow swimming turtle-like
Etapa 2: adicionar parâmetros obrigatórios
Se nenhum padrão for especificado para um parâmetro, o argumento correspondente sempre precisará ser transmitido.
- Em Hello.kt, escreva uma função
shouldChangeWater()que receba três parâmetros:day,temperaturee um níveldirty. A função retornatruese a água precisa ser trocada, o que acontece se for domingo, se a temperatura estiver muito alta ou se a água estiver muito suja. O dia da semana é obrigatório, mas a temperatura padrão é 22, e o nível de sujeira padrão é 20.
Use uma expressãowhensem um argumento, que em Kotlin funciona como uma série de verificaçõesif/else if.
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20): Boolean {
return when {
temperature > 30 -> true
dirty > 30 -> true
day == "Sunday" -> true
else -> false
}
}- Chame
shouldChangeWater()defeedTheFish()e forneça o dia. O parâmetrodaynão tem um valor padrão. Portanto, é necessário especificar um argumento. Os outros dois parâmetros deshouldChangeWater()têm valores padrão, então não é necessário transmitir argumentos para eles.
fun feedTheFish() {
val day = randomDay()
val food = fishFood(day)
println ("Today is $day and the fish eat $food")
println("Change water: ${shouldChangeWater(day)}")
}=> Today is Thursday and the fish eat granules Change water: false
Etapa 3: criar funções compactas
A expressão when que você escreveu na etapa anterior reúne muita lógica em uma pequena quantidade de código. Se você quiser detalhar um pouco mais ou se as condições a serem verificadas forem mais complicadas, use algumas variáveis locais com nomes adequados. Mas a maneira do Kotlin de fazer isso é com funções compactas.
Funções compactas, ou funções de expressão única, são um padrão comum em Kotlin. Quando uma função retorna os resultados de uma única expressão, é possível especificar o corpo da função após um símbolo =, omitir as chaves {} e omitir o return.
- Em Hello.kt, adicione funções compactas para testar as condições.
fun isTooHot(temperature: Int) = temperature > 30
fun isDirty(dirty: Int) = dirty > 30
fun isSunday(day: String) = day == "Sunday"- Mude
shouldChangeWater()para chamar as novas funções.
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20): Boolean {
return when {
isTooHot(temperature) -> true
isDirty(dirty) -> true
isSunday(day) -> true
else -> false
}
}- Execute o programa. A saída do
println()comshouldChangeWater()precisa ser a mesma de antes da mudança para funções compactas.
Valores padrão
O valor padrão de um parâmetro não precisa ser um valor. Pode ser outra função, conforme mostrado no exemplo parcial a seguir:
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = getDirtySensorReading()): Boolean {
...Nesta tarefa, você vai aprender um pouco sobre filtros em Kotlin. Os filtros são uma maneira prática de receber parte de uma lista com base em alguma condição.
Etapa 1: criar um filtro
- Em Hello.kt, defina uma lista de decorações de aquário no nível superior com
listOf(). Você pode substituir o conteúdo de Hello.kt.
val decorations = listOf ("rock", "pagoda", "plastic plant", "alligator", "flowerpot")- Crie uma função
main()com uma linha para imprimir apenas as decorações que começam com a letra "p". O código da condição de filtro está entre chaves{}, eitse refere a cada item à medida que o filtro passa por eles. Se a expressão retornartrue, o item será incluído.
fun main() {
println( decorations.filter {it[0] == 'p'})
}- Execute o programa. Você vai encontrar a seguinte saída na janela Executar:
⇒ [pagoda, plastic plant]
Etapa 2: comparar filtros imediatos e lentos
Se você conhece filtros em outras linguagens, talvez se pergunte se os filtros em Kotlin são rápidos ou lentos. A lista de resultados é criada imediatamente ou quando ela é acessada? No Kotlin, isso acontece da maneira que você precisa. Por padrão, filter é ansioso, e uma lista é criada sempre que você usa o filtro.
Para tornar o filtro lento, use um Sequence, que é uma coleção que só pode analisar um item por vez, começando do início e indo até o fim. Convenientemente, essa é exatamente a API de que um filtro lento precisa.
- Em Hello.kt, mude o código para atribuir a lista filtrada a uma variável chamada
eagere imprima-a.
fun main() {
val decorations = listOf ("rock", "pagoda", "plastic plant", "alligator", "flowerpot")
// eager, creates a new list
val eager = decorations.filter { it [0] == 'p' }
println("eager: " + eager)- Abaixo desse código, avalie o filtro usando um
SequencecomasSequence(). Atribua a sequência a uma variável chamadafilterede imprima-a.
// lazy, will wait until asked to evaluate
val filtered = decorations.asSequence().filter { it[0] == 'p' }
println("filtered: " + filtered)Quando você retorna os resultados do filtro como um Sequence, a variável filtered não contém uma nova lista. Ela contém um Sequence dos elementos da lista e o conhecimento do filtro a ser aplicado a esses elementos. Sempre que você acessa elementos do Sequence, o filtro é aplicado e o resultado é retornado.
- Forçar a avaliação da sequência convertendo-a em um
ListcomtoList(). Imprima o resultado.
// force evaluation of the lazy list
val newList = filtered.toList()
println("new list: " + newList)- Execute o programa e observe a saída.
⇒ eager: [pagoda, plastic plant] filtered: kotlin.sequences.FilteringSequence@386cc1c4 new list: [pagoda, plastic plant]
Para visualizar o que está acontecendo com a Sequence e a avaliação lenta, use a função map(). A função map() realiza uma transformação simples em cada elemento da sequência.
- Com a mesma lista
decorationsacima, faça uma transformação commap()que não faz nada e simplesmente retorna o elemento transmitido. Adicione umprintln()para mostrar cada vez que um elemento é acessado e atribua a sequência a uma variável chamadalazyMap.
val lazyMap = decorations.asSequence().map {
println("access: $it")
it
}- Imprima
lazyMap, o primeiro elemento delazyMapusandofirst()elazyMapconvertido em umList.
println("lazy: $lazyMap")
println("-----")
println("first: ${lazyMap.first()}")
println("-----")
println("all: ${lazyMap.toList()}")- Execute o programa e observe a saída. A impressão de
lazyMapapenas mostra uma referência aoSequence. Oprintln()interno não é chamado. A impressão do primeiro elemento acessa apenas o primeiro elemento. Converter oSequenceem umListacessa todos os elementos.
⇒ lazy: kotlin.sequences.TransformingSequence@5ba23b66 ----- access: rock first: rock ----- access: rock access: pagoda access: plastic plant access: alligator access: flowerpot all: [rock, pagoda, plastic plant, alligator, flowerpot]
- Crie um novo
Sequenceusando o filtro original antes de aplicarmap. Imprima esse resultado.
val lazyMap2 = decorations.asSequence().filter {it[0] == 'p'}.map {
println("access: $it")
it
}
println("-----")
println("filtered: ${ lazyMap2.toList() }")- Execute o programa e observe a saída adicional. Assim como ao receber o primeiro elemento, o
println()interno só é chamado para os elementos acessados.
⇒ ----- access: pagoda access: plastic plant filtered: [pagoda, plastic plant]
Nesta tarefa, você vai conhecer lambdas e funções de ordem superior no Kotlin.
Lambdas
Além das funções nomeadas tradicionais, o Kotlin é compatível com lambdas. Um lambda é uma expressão que cria uma função. Mas, em vez de declarar uma função nomeada, você declara uma função que não tem nome. Parte do que torna isso útil é que a expressão lambda agora pode ser transmitida como dados. Em outras linguagens, os lambdas são chamados de funções anônimas, literais de função ou nomes semelhantes.
Funções de ordem superior
É possível criar uma função de ordem superior transmitindo uma lambda para outra função. Na tarefa anterior, você criou uma função de ordem superior chamada filter. Você transmitiu a seguinte expressão lambda para filter como a condição a ser verificada:{it[0] == 'p'}
Da mesma forma, map é uma função de ordem superior, e o lambda transmitido a ela foi a transformação a ser aplicada.
Etapa 1: saiba mais sobre lambdas
- Assim como as funções nomeadas, as lambdas podem ter parâmetros. Para lambdas, os parâmetros (e os tipos deles, se necessário) ficam à esquerda do que é chamado de seta de função
->. O código a ser executado fica à direita da seta da função. Depois que a lambda é atribuída a uma variável, é possível chamá-la como uma função.
Usando o REPL (Ferramentas > Kotlin > Kotlin REPL), teste este código:
var dirtyLevel = 20
val waterFilter = { dirty : Int -> dirty / 2}
println(waterFilter(dirtyLevel))⇒ 10
Neste exemplo, a lambda usa um Int chamado dirty e retorna dirty / 2. (Porque a filtragem remove a sujeira.)
- A sintaxe do Kotlin para tipos de função está intimamente relacionada à sintaxe para lambdas. Use esta sintaxe para declarar uma variável que contém uma função:
val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }Veja o que o código diz:
- Crie uma variável chamada
waterFilter. waterFilterpode ser qualquer função que use umInte retorne umInt.- Atribua um lambda a
waterFilter. - A lambda retorna o valor do argumento
dirtydividido por 2.
Não é mais necessário especificar o tipo do argumento lambda. O tipo é calculado por inferência de tipo.
Etapa 2: criar uma função de ordem superior
Até agora, os exemplos de lambdas parecem funções. O verdadeiro poder dos lambdas está em usá-los para criar funções de ordem superior, em que o argumento de uma função é outra função.
- Escreva uma função de ordem superior. Confira um exemplo básico, uma função que usa dois argumentos. O primeiro argumento é um número inteiro. O segundo argumento é uma função que usa um número inteiro e retorna um número inteiro. Teste no REPL.
fun updateDirty(dirty: Int, operation: (Int) -> Int): Int {
return operation(dirty)
}O corpo do código chama a função transmitida como o segundo argumento e transmite o primeiro argumento para ela.
- Para chamar essa função, transmita um número inteiro e uma função.
val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }
println(updateDirty(30, waterFilter))⇒ 15
A função transmitida não precisa ser uma lambda. Ela pode ser uma função nomeada regular. Para especificar o argumento como uma função regular, use o operador ::. Assim, o Kotlin sabe que você está transmitindo a referência da função como um argumento, e não tentando chamar a função.
- Tente transmitir uma função nomeada regular para
updateDirty().
fun increaseDirty( start: Int ) = start + 1
println(updateDirty(15, ::increaseDirty))⇒ 16
var dirtyLevel = 19;
dirtyLevel = updateDirty(dirtyLevel) { dirtyLevel -> dirtyLevel + 23}
println(dirtyLevel)⇒ 42
- Para criar um arquivo de origem Kotlin no IntelliJ IDEA, comece com um projeto Kotlin.
- Para compilar e executar um programa no IntelliJ IDEA, clique no triângulo verde ao lado da função
main(). A saída aparece em uma janela de registro abaixo. - No IntelliJ IDEA, especifique argumentos de linha de comando para transmitir à função
main()em Run > Edit Configurations. - Quase tudo em Kotlin tem um valor. É possível usar esse fato para deixar seu código mais conciso usando o valor de um
ifouwhencomo uma expressão ou um valor de retorno. - Os argumentos padrão eliminam a necessidade de várias versões de uma função ou método. Exemplo:
fun swim(speed: String = "fast") { ... } - Funções compactas, ou de expressão única, podem tornar seu código mais legível. Exemplo:
fun isTooHot(temperature: Int) = temperature > 30 - Você aprendeu algumas noções básicas sobre filtros, que usam expressões lambda. Exemplo:
val beginsWithP = decorations.filter { it [0] == 'p' } - Uma expressão lambda é uma expressão que cria uma função sem nome. As expressões lambda são definidas entre chaves
{}. - Em uma função de ordem superior, você transmite uma função, como uma expressão lambda, para outra função como dados. Por exemplo:
dirtyLevel = updateDirty(dirtyLevel) { dirtyLevel -> dirtyLevel + 23}
Há muito conteúdo nesta lição, especialmente se você não conhece lambdas. Uma lição posterior revisita lambdas e funções de ordem superior.
Documentação do Kotlin
Se você quiser mais informações sobre algum tópico deste curso ou se tiver dúvidas, https://kotlinlang.org é o melhor ponto de partida.
- Modelos de string (link em inglês)
- Expressão
when - Funções de expressão única
- Funções de ordem superior e lambdas
- Filtros
- sequências
- Sintaxe da última chamada de parâmetro
Tutoriais do Kotlin
O site https://try.kotlinlang.org inclui tutoriais avançados chamados Kotlin Koans, um interpretador baseado na Web e um conjunto completo de documentação de referência com exemplos.
Curso Udacity
Para conferir o curso da Udacity sobre esse tema, consulte Treinamento do Kotlin para programadores (link em inglês).
IntelliJ IDEA
A documentação do IntelliJ IDEA está disponível no site da JetBrains.
Esta seção lista as possíveis atividades de dever de casa para os alunos que estão fazendo este codelab como parte de um curso ministrado por um professor. Cabe ao professor fazer o seguinte:
- Atribuir o dever de casa, se necessário.
- Informar aos alunos como enviar deveres de casa.
- Atribuir nota aos deveres de casa.
Os professores podem usar essas sugestões o quanto quiserem, podendo passar os exercícios que acharem mais apropriados como dever de casa.
Se você estiver seguindo este codelab por conta própria, sinta-se à vontade para usar esses deveres de casa para testar seu conhecimento.
Responda estas perguntas
Pergunta 1
A função contains(element: String) retorna true se a string element estiver contida na string em que ela é chamada. Qual será a saída do código a seguir?
val decorations = listOf ("rock", "pagoda", "plastic plant", "alligator", "flowerpot")
println(decorations.filter {it.contains('p')})
▢ [pagoda, plastic, plant]
▢ [pagoda, plastic plant]
▢ [pagoda, plastic plant, flowerpot]
▢ [rock, alligator]
Pergunta 2
Na definição de função a seguir, qual dos parâmetros é obrigatório?fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20, numDecorations: Int = 0): Boolean {...}
▢ numDecorations
▢ dirty
▢ day
▢ temperature
Pergunta 3
É possível transmitir uma função nomeada regular (não o resultado da chamada dela) para outra função. Como você transmitiria increaseDirty( start: Int ) = start + 1 para updateDirty(dirty: Int, operation: (Int) -> Int)?
▢ updateDirty(15, &increaseDirty())
▢ updateDirty(15, increaseDirty())
▢ updateDirty(15, ("increaseDirty()"))
▢ updateDirty(15, ::increaseDirty)
Siga para a próxima lição:
Para ter uma visão geral do curso, incluindo links para outros codelabs, consulte "Treinamento do Kotlin para programadores: seja bem-vindo ao curso".