1. Введение
Обычно, когда мы думаем о новых функциях, появившихся в версии 8 Java, первыми на ум приходят функциональное программирование и лямбда-выражения.
Тем не менее, помимо этих важных функций, есть и другие, возможно, имеющие меньшее влияние, но также интересные и часто не очень известные или даже не освещенные в каких-либо обзорах.
В этом руководстве мы перечислим и приведем небольшой пример каждого из новых методов, добавленных в один из основных классов языка: java.lang.Math
.
2. Новые методы *exact()
Во-первых, у нас есть группа новых методов, которые расширяют некоторые из существующих и наиболее распространенных арифметических операций.
Как мы увидим, они говорят сами за себя, поскольку имеют точно такую же функциональность, что и методы, от которых они происходят, но с добавлением генерации исключения в случае, если результирующее значение переполняет максимальное или минимальное значение их типов. .
Мы можем использовать эти методы как с целыми
, так и с длинными
параметрами.
2.1. добавитьТочный()
Добавляет два параметра, вызывая исключение ArithmeticException
в случае переполнения (которое касается всех методов *Exact()
) добавления:
Math.addExact(100, 50); // returns 150
Math.addExact(Integer.MAX_VALUE, 1); // throws ArithmeticException
2.2. вычестьТочный()
Вычитает значение второго параметра из первого, выбрасывая исключение ArithmeticException
в случае переполнения вычитания:
Math.subtractExact(100, 50); // returns 50
Math.subtractExact(Long.MIN_VALUE, 1); // throws ArithmeticException
2.3. приращениеТочный()
Увеличивает параметр на единицу, вызывая исключение ArithmeticException
в случае переполнения:
Math.incrementExact(100); // returns 101
Math.incrementExact(Integer.MAX_VALUE); // throws ArithmeticException
2.4. декрементТочный()
Уменьшает параметр на единицу, вызывая исключение ArithmeticException
в случае переполнения:
Math.decrementExact(100); // returns 99
Math.decrementExact(Long.MIN_VALUE); // throws ArithmeticException
2.5. умножитьТочно()
Перемножьте два параметра, выбрасывая исключение ArithmeticException
в случае переполнения продукта:
Math.multiplyExact(100, 5); // returns 500
Math.multiplyExact(Long.MAX_VALUE, 2); // throws ArithmeticException
2.6. отрицательныйТочный()
Изменяет знак параметра, вызывая исключение ArithmeticException
в случае переполнения.
В этом случае мы должны думать о внутреннем представлении значения в памяти, чтобы понять, почему происходит переполнение, так как это не так интуитивно понятно, как остальные «точные» методы:
Math.negateExact(100); // returns -100
Math.negateExact(Integer.MIN_VALUE); // throws ArithmeticException
Второй пример требует объяснения, так как он не очевиден: переполнение происходит из-за того , что Integer.MIN_VALUE равно
−2.147.483.648, а с другой стороны, Integer.MAX_VALUE равно
2.147.483.647, поэтому возвращаемое значение не помещается в Integer
. на одну единицу.
3. Другие методы
3.1. этажDiv()
Делит первый параметр на второй, а затем выполняет операцию floor()
над результатом, возвращая целое число
, которое меньше или равно частному:
Math.floorDiv(7, 2)); // returns 3
Точное частное равно 3,5, поэтому пол (3,5)
== 3.
Давайте посмотрим на другой пример:
Math.floorDiv(-7, 2)); // returns -4
Точное частное равно -3,5, поэтому пол (-3,5)
== -4.
3.2. модДив()
Этот метод похож на предыдущий метод floorDiv()
, но применяет операцию floor()
к модулю или остатку от деления вместо частного:
Math.modDiv(5, 3)); // returns 2
Как мы видим, modDiv()
для двух положительных чисел совпадает с оператором % . Давайте рассмотрим другой пример:
Math.modDiv(-5, 3)); // returns 1
Он возвращает 1, а не 2, потому что floorDiv(-5, 3)
равен -2, а не -1.
3.3. следующийВниз()
Возвращает непосредственно меньшее значение параметра (поддерживает параметры float
или double
):
float f = Math.nextDown(3); // returns 2.9999998
double d = Math.nextDown(3); // returns 2.999999761581421
4. Вывод
В этой статье мы кратко описали функциональность всех новых методов, добавленных в класс java.lang.Math
в версии 8 платформы Java, а также рассмотрели несколько примеров их использования.
Как всегда, полный исходный код доступен на GitHub .