Novos métodos matemáticos do Java 8
1. Introdução
Normalmente, quando pensamos nos novos recursos que vieram com a versão 8 do Java, programação funcional e expressões lambda são as primeiras coisas que vêm à mente.
No entanto, além desses grandes recursos, existem outros, talvez com um impacto menor, mas também interessantes e muitas vezes não muito conhecidos ou mesmo cobertos por alguma revisão.
Neste tutorial, vamos enumerar e dar um pequeno exemplo de cada um dos novos métodos adicionados a uma das classes principais da linguagem:java.lang.Math.
2. Novos métodos*exact()
Primeiro, temos um grupo de novos métodos que estendem algumas das operações aritméticas mais comuns e existentes.
Como veremos, eles são bastante autoexplicativos, pois têm exatamente a mesma funcionalidade dos métodos dos quais derivam, mas comthe addition of throwing an exception in case, the resulting value overflows the max or min values of their types.
Podemos usar esses métodos comintegers elongs como parâmetros.
2.1. addExact()
Adiciona os dois parâmetros,throwing an ArithmeticException in case of overflow (which goes for all *Exact() methods) da adição:
Math.addExact(100, 50); // returns 150
Math.addExact(Integer.MAX_VALUE, 1); // throws ArithmeticException
2.2. substractExact()
Subtrai o valor do segundo parâmetro do primeiro, jogando umArithmeticException em caso de estouro da subtração:
Math.subtractExact(100, 50); // returns 50
Math.subtractExact(Long.MIN_VALUE, 1); // throws ArithmeticException
2.3. incrementExact()
Incrementa o parâmetro em um, lançando umArithmeticException em caso de estouro:
Math.incrementExact(100); // returns 101
Math.incrementExact(Integer.MAX_VALUE); // throws ArithmeticException
2.4. decrementExact()
Diminui o parâmetro em um, lançando umArithmeticException em caso de estouro:
Math.decrementExact(100); // returns 99
Math.decrementExact(Long.MIN_VALUE); // throws ArithmeticException
2.5. multiplyExact()
Multiplique os dois parâmetros, jogando umArithmeticException em caso de estouro do produto:
Math.multiplyExact(100, 5); // returns 500
Math.multiplyExact(Long.MAX_VALUE, 2); // throws ArithmeticException
2.6. negateExact()
Muda o sinal do parâmetro, jogando umArithmeticException em caso de estouro.
Neste caso, temos que pensar na representação interna do valor na memória para entender porque há um estouro, já que não é tão intuitivo quanto o resto dos métodos “exatos”:
Math.negateExact(100); // returns -100
Math.negateExact(Integer.MIN_VALUE); // throws ArithmeticException
O segundo exemplo requer uma explicação, pois não é óbvio:The overflow is due to the Integer.MIN_VALUE being −2.147.483.648, and on the other side the Integer.MAX_VALUE being 2.147.483.647, portanto, o valor retornado não se ajusta aInteger por uma unidade.
3. Outros métodos
3.1. floorDiv()
Divide o primeiro parâmetro pelo segundo e, em seguida, realiza uma operaçãofloor() sobre o resultado, retornando oInteger que é menor ou igual ao quociente:
Math.floorDiv(7, 2)); // returns 3
O quociente exato é 3,5, entãofloor(3.5) == 3.
Vejamos outro exemplo:
Math.floorDiv(-7, 2)); // returns -4
O quociente exato é -3,5 entãofloor(-3.5) == -4.
3.2. modDiv()
Este é semelhante ao método anteriorfloorDiv(), mas aplicando a operaçãofloor() sobre o módulo ou o resto da divisão em vez do quociente:
Math.modDiv(5, 3)); // returns 2
Como podemos ver, omodDiv() for two positive numbers is the same as % operator. Vejamos um exemplo diferente:
Math.modDiv(-5, 3)); // returns 1
Ele retorna 1 e não 2 porquefloorDiv(-5, 3) é -2 e não -1.
3.3. nextDown()
Retorna o valor imediatamente inferior do parâmetro (suporta os parâmetrosfloat oudouble):
float f = Math.nextDown(3); // returns 2.9999998
double d = Math.nextDown(3); // returns 2.999999761581421
4. Conclusão
Neste artigo, descrevemos brevemente a funcionalidade de todos os novos métodos adicionados à classejava.lang.Math na versão 8 da plataforma Java e também vimos alguns exemplos de como usá-los.
Como sempre, o código-fonte completo está disponívelover on GitHub.