Funções

Funções

Observação: Os arquivos utilizados neste conteúdo que falam sobre funções em geral, são respectivamente:

Neste conteúdo vamos aprender sobre funções, funções matemáticas e os usos das funções de strings que são disponibilizadas pela linguagem.

O que são Funções?

De modo geral, o Kotlin conta com uma estrutura de blocos popularmente conhecida como funções.

Elas são consideradas "subprogramas" de um programa principal, por vezes chamadas de código externo/interno de uma aplicação em Kotlin.

As funções seguem um esquema bem parecido com as estrutura de controle de fluxo (If/Else) e também com as estruturas de iterações (for, while...), isso porque ela também trabalha com blocos de código usando chaves.

Veja como funciona uma função no Kotlin:

fun main() { 
olaMundo()//Modo de chamar a função, pode ser chamado quantas vezes quiser
}

fun olaMundo(){//Função simples que não recebe parâmetros nem retorno
println("Olá Mundo!")//Dentro da função podemos ter diversos comandos
}

Podemos dizer ao Kotlin que aquela função não possui retorna de forma um pouco mais explícita, e nos podemos fazer isso usando o Unit:

fun main() {
olaMundoUnit()//Mesma lógica do de cima
}

fun olaMundoUnit(): Unit{//Significa que essa função não tem retorno, deixa isso de forma explícita (opcional usar Unit quando não tem retorno)
println("Olá Mundo!")
}

As funções, elas podem ter algum tipo de retorno. Veja no exemplo abaixo uma função que retorna um dado do tipo STRING:

fun main() {
val retorno = olaMundoRetorno()//Como essa função retorna algo, estamos salvando numa variável, mas poderiamos imprimir direto no println
}

fun olaMundoRetorno(): String{//Função que retorna uma string
return "Olá Mundo"//usamos o return para retornar
}

Também é suportado chamar uma função enviando parâmetros a ela:

fun main() {
println(mensagem("Micilini"))//Chamando uma função com 1 parâmetro
}
fun mensagem(nome: String): String{//Função com parâmetro e retorno de string
return "Olá $nome"
}

Veja agora um outro exemplo, onde estamos enviando dois parâmetros:

fun main(){
println(soma(10, 2))//Chamando uma função com dois parâmetros
}

fun soma(a: Int, b: Int): Int{//Função com mais de um parâmetro que faz a soma
return (a + b)
}

Veja agora o uso da interpolação de uma função sendo chamada dentro de um println():

fun main(){
println("A soma de 10 e 2 é: ${soma(10, 2)}")//Uso da interpolação
}

fun soma(a: Int, b: Int): Int{//Função com mais de um parâmetro que faz a soma
return (a + b)
}

Funções com um único retorno

É possível criar funções que contenham apenas um único retorno, vejamos o exemplo:

fun somaDois(a: Int, b: Int): Int = (a + b)//Tipo de função que tem apenas um único comando

fun somaTres(a: Int, b: Int) = (a + b)//Tipo de função que tem apenas um único comando, dessa vez sem o INT (pois o JVM se vira para identificar o retorno)

fun helloWorld() = println("Hello, world!")//Função que não tem retorno, mas é única linha

Variações de uma mesma função

No kotlin, podemos ter diversas funções com o mesmo nome, desde que cada uma delas trate seus parâmetros de forma diferente:

fun subtrair(){}

fun subtrair(a: Int){}

fun subtrair(a: Int, b: Int){}

Funções com parâmetros adicionais

Nem sempre queremos criar uma função em que todos os parâmetros são obrigatórios, sendo assim, podemos definir alguns deles como opcionais:

fun main(){
endereco(estado = "Rio de Janeiro", rua = "Brazilis", cidade = "Rio de Janeiro")//Aqui estamos passando os parâmetros de forma desordenada.
//É importante ressaltar que a função acima só trocar a ordem da declaração dos parâmetros, mas não influencia em nada na função.
//Se em um parâmetro você teve que informar o nome, você precisa informar todos até o fim!
}

fun minhaFuncao(rua: String, cep: Int = 99999999){
//Você chamaria essa função assim: minhaFuncao("Rua Bellas Artes"), e poderiamos usar o cep com o valor padrão.
//Caso desejar, você poderia passar o cep também: minhaFuncao("Rua Bellas Artes", 21521478)
}

fun endereco(rua: String, cidade: String, estado: String){

}

Uso do Vararg

No Kotlin nós temos um tipo de variável chamada vararg que permite receber diversos tipos de parâmetros em uma função:

fun main(){
media(1f, 2f, 3f, 4f, 5.98f);//Exemplo de multiplos parâmetros com vararg
}

//Recebendo múltiplos parâmetros dentro de uma única variável:
fun media(vararg notas: Float){
var soma = 0f
var tamanho = notas.size//Size é o tamanho das variáveis que vieram
for(n in notas){
soma +=n
}
println(soma/tamanho)//Resultado da média
}

Println, Print e Main também são funções

Analisando o que aprendemos até aqui, podemos perceber que os comandos Println()Print() e até mesmo o Main são considerados funções.

Pois a forma como estamos chamando eles, e até mesmo os declarando (como é o caso do Main) acontece da mesma forma como fizemos com nossas funções.

fun main(){//A função principal main também não deixa de ser considerada uma função.
//Println e Print também são funções!
println("")//Função padrão do Kotlin que printa no console (com quebra de linha)
print("")//Mesma lógica anterior (sem quebra de linha)
}

Funções Matemáticas

O kotlin nos disponibiliza algumas funções da própria linguagem que nos ajuda a realizar algumas operações matemáticas, vejamos algumas delas:

import kotlin.math.*//Como estamos usando mais de uma biblioteca de Math o Kotlin importa todas de uma vez

fun main() {
//Funções Matemáticas

println(max(5, 10))//Retorna o maior número entre dois valores
println(min(5, 10))//Retorna o menor número entre dois valores
println(sqrt(45.68))//Retorna a raíz quadrada do valor
println(PI)//Retorna o PI
println(E)//Retorna o Euler
println(round(12312.234234234))//Arredondar para cima

}

Lembrando que precisamos importar a biblioteca de funções matemáticas para ter acesso a essas funções (import kotlin.math.*)

Para saber mais sobre as funções do tipo Math e conhecer outras acesse este link.

Funções de Formatação de Strings

Em conteúdos anteriores, vimos como formatar strings usando o console.

Agora vamos conhecer algumas funções um pouco mais avançadas que nos ajudam a formatar o tipo STRING:

fun main(){
//Exemplo de uso de funções que formatam STRINGS:

val meuTexto = "Programação Kotlin"

println("Tamanho da String: ${meuTexto.length}")//Retorna o tamanho da string

println("Posição 0 da string: ${meuTexto[0]}")//Retorna o elemento da posição 0 da string

println("Começa com Pro? ${meuTexto.startsWith("Pro", false)}")//Verifica se a string começa com algum texto. IgnoreCase ignora caso sensitivo (maiusculo minusculo)

println("Termina com abc? ${meuTexto.endsWith("abc")}")//Mesma lógica de cima, só que invertido (termina com)

println(meuTexto.substring(2))//Pula duas posições e começa a partir daí

println(meuTexto.substring(2, 4))//Retorna da posição 3 até 4

println(meuTexto.replace("Kotlin", "Android"))//Troca as string, de 'kotlinpara 'Android'

println(meuTexto.lowercase())//Converte tudo para minúsculo

println(meuTexto.uppercase())//Converte para maiúsculo

println(meuTexto.trim())//Elimina espaços em branco no início e no final da string
}

Com essas funções nós podemos converter um texto para maiúsculo, minúsculo, selecionar o primeiro caractere, eliminar espaços em branco, fazer substituições e entre outras coisas.

Usando Funções com Controle de Fluxo

Também é possível fazer o uso de funções com algumas estruturas que já conhecemos relacionadas ao controle de fluxo, vejamos alguns exemplos.

Usando o IF/ELSE:

fun main(){
//Podemos ter um retorno direto
val resultado = retornoUm(true)
}

fun retornoUm(t: Boolean): String{
return if(t){
"Bom dia"
}else{
"Boa Noite"
}//Esse return do IF só funciona se existir
}

Outros exemplos de retorno:

fun main(){
println("Maior de Idade? ${maiorDeIdade(15)}")
}

fun maiorDeIdade(idade: Int): Boolean{
if(idade > 18){
return true
}
return false
//Poderiamos ter retornado assim: return (idade > 18), pois o proprio retorno é um booleano
}

Exemplo de uma função de retorno direto:

fun retornoDois(t: Boolean) = if(t){
"Bom dia"
}else{
"Boa Noite"
}

Usando o While:

fun main(){
//Exemplo de funções com o controle de fluxo While:

println(bonusWhen("Engenheiro de Software"))

println(whenComRange(5))

println(whenComBoolean(false))
}

//Funções com While:

fun bonusWhen(cargo: String): Float{
return when(cargo){
"Gerente" -> 2000f
"Coordenador" -> 1500f
"Engenheiro de Software" -> 1000f
"Estagiário" -> 500f
else -> 0f
}//Exemplo de When com Retorno automático
}

fun whenComRange(n: Int): Unit{
when(n){
in 1..10 -> println("1...10")
in 10..20 -> println("10...20")
}
}

fun whenComBoolean(b: Boolean): Unit{
when(b){
true -> println("Verdadeiro")
false -> println("Falso")
}
}

Conclusão

Neste conteúdo aprendemos bastante coisa sobre o uso de funções.

Aprendemos a como criar, chamar, passar parâmetros obrigatórios e opcionais, funções matemáticas, funções de strings, e o uso do controle de fluxo atuando em conjunto com funções. 

Até o próximo conteúdo 😃