Funções de extensão para Comparable: entendendo o coerceAtLeast, coerceAtMost e coerceIn

Funções de extensão

– coerceAtLeast e coerceAtMost

Se essas funções fossem descritas em português poderiam ser algo como, “coagirPeloMinimo” e “coagirPeloMaximo”

Eu acho essas duas funções bastante úteis em uma implementaçõe onde eu tenha que garantir que um valor não seja menor que o mínimo ou maior que o máximo especificado, e o legal é que ela aceita todos os tipos básicos. Isso significa que eu posso trabalhar com Dates, Doubles, Long…. etc

Vamos começar testando dois exemplos bem simples.

Primeiro vamos usar um inteiro e em seguida vamos ver um exemplo com datas:

println(100.coerceAtLeast(10))
println(10.coerceAtLeast(100))
100
100

No exemplo acima, temos duas implementações usando o coerceAtLeast e ambas trazem o mesmo resultado 100.

Mas por quê isso acontece?

No primeiro “print” eu tenho o inteiro 100 e ao usar a função de extensão coerceAtLeast(10) estou dizendo que quero garantir que o menor inteiro possível nessa implementação seja 10, então se estou trazendo um valor maior, ele será o valor impresso, pois está dentro do critério pré-definido quando chamamos a função de extensão coerceAtLeast(10).

Já no segundo “print” eu tenho o inteiro 10 e estou usando a mesma função coerceAtLeast, só que dessa vez, estou dizendo que o valor mínimo é 100, quando utilizo ele como parâmetro da função <coerceAtLeast(100)> . Dessa forma, qualquer valor dentro do comparable, que seja menor que 100 será impresso o valor 100, pois estou querendo garantir que ele seja o menor inteiro possível nessa implementação.

A mesma lógica ocorre com o coerceAtMost só que de maneira inversa, pois ele vai garantir que o valor comparado, nunca seja maior que o máximo.

println(100.coerceAtMost(10))
println(10.coerceAtMost(100))
10
10

Agora temos o 10 como resultado para os dois prints, apenas por que invertemos a lógica.

No primeiro “print”, eu trago o inteiro 100, mas ele só aceita no máximo o inteiro 10, retornando dessa forma o valor 10

No segundo “print”, eu trago o inteiro 10 e ele aceita até no máximo o 100, retornando também, o valor 10

Share