Java 8 Math Новые методы
1. Вступление
Обычно, когда мы думаем о новых функциях, появившихся в версии 8 Java, первое, что приходит на ум, - это функциональное программирование и лямбда-выражения.
Тем не менее, помимо этих важных функций, есть и другие, возможно, имеющие меньшее влияние, но также интересные и часто не очень известные или даже не охваченные каким-либо обзором.
В этом руководстве мы перечислим и дадим небольшой пример каждого из новых методов, добавленных к одному из основных классов языка:java.lang.Math.
2. Новые методы*exact()
Во-первых, у нас есть группа новых методов, которые расширяют некоторые из существующих и наиболее распространенных арифметических операций.
Как мы увидим, они говорят сами за себя, поскольку имеют точно такие же функциональные возможности, что и методы, из которых они созданы, но сthe addition of throwing an exception in case, the resulting value overflows the max or min values of their types.
Мы можем использовать эти методы с параметрами какintegers, так иlongs.
2.1. addExact()с
Добавляет два параметраthrowing an ArithmeticException in case of overflow (which goes for all *Exact() methods) сложения:
Math.addExact(100, 50); // returns 150
Math.addExact(Integer.MAX_VALUE, 1); // throws ArithmeticException
2.2. substractExact()с
Вычитает значение второго параметра из первого, выбрасываяArithmeticException в случае переполнения при вычитании:
Math.subtractExact(100, 50); // returns 50
Math.subtractExact(Long.MIN_VALUE, 1); // throws ArithmeticException
2.3. incrementExact()с
Увеличивает параметр на единицу, выбрасываяArithmeticException в случае переполнения:
Math.incrementExact(100); // returns 101
Math.incrementExact(Integer.MAX_VALUE); // throws ArithmeticException
2.4. decrementExact()с
Уменьшает параметр на единицу, выбрасываяArithmeticException в случае переполнения:
Math.decrementExact(100); // returns 99
Math.decrementExact(Long.MIN_VALUE); // throws ArithmeticException
2.5. multiplyExact()с
Умножьте два параметра, выбрасываяArithmeticException в случае переполнения продукта:
Math.multiplyExact(100, 5); // returns 500
Math.multiplyExact(Long.MAX_VALUE, 2); // throws ArithmeticException
2.6. negateExact()с
Меняет знак параметра, выбрасываяArithmeticException в случае переполнения.
В этом случае мы должны подумать о внутреннем представлении значения в памяти, чтобы понять, почему происходит переполнение, поскольку это не так интуитивно понятно, как остальные «точные» методы:
Math.negateExact(100); // returns -100
Math.negateExact(Integer.MIN_VALUE); // throws ArithmeticException
Второй пример требует объяснения, поскольку он не очевиден: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, поэтому возвращаемое значение не укладывается вInteger на одну единицу.
3. Другие Методы
3.1. floorDiv()с
Делит первый параметр на второй, а затем выполняет операциюfloor() над результатом, возвращаяInteger, которое меньше или равно частному:
Math.floorDiv(7, 2)); // returns 3
Точное частное составляет 3,5, поэтомуfloor(3.5) == 3.
Давайте посмотрим на другой пример:
Math.floorDiv(-7, 2)); // returns -4
Точное частное равно -3,5, поэтомуfloor(-3.5) == -4.
3.2. modDiv()с
Этот метод аналогичен предыдущему методуfloorDiv(), но с применением операцииfloor() по модулю или остатку от деления вместо частного:
Math.modDiv(5, 3)); // returns 2
Как видим,modDiv() for two positive numbers is the same as % operator. Давайте посмотрим на другой пример:
Math.modDiv(-5, 3)); // returns 1
Он возвращает 1, а не 2, потому чтоfloorDiv(-5, 3) равно -2, а не -1.
3.3. nextDown()с
Возвращает непосредственно меньшее значение параметра (поддерживает параметрыfloat илиdouble):
float f = Math.nextDown(3); // returns 2.9999998
double d = Math.nextDown(3); // returns 2.999999761581421
4. Заключение
В этой статье мы кратко описали функциональность всех новых методов, добавленных к классуjava.lang.Math в версии 8 платформы Java, а также увидели некоторые примеры их использования.
Как всегда, доступен полный исходный кодover on GitHub.