1. введение
Обычно, когда мы думаем о новых функциях, которые появились в версии 8 Java, функциональное программирование и лямбда-выражения-это первое, что приходит на ум.
Тем не менее, помимо этих больших функций есть и другие, возможно, имеющие меньшее влияние, но также интересные и во многих случаях не очень известные или даже не охваченные каким-либо обзором.
В этом уроке мы перечислим и приведем небольшой пример каждого из новых методов, добавленных в один из основных классов языка: java.lang.Математика .
2. Новые *точные() Методы
Во-первых, у нас есть группа новых методов, которые расширяют некоторые из существующих и наиболее распространенных арифметических операций.
Как мы увидим, они вполне понятны, поскольку имеют точно такую же функциональность, как и методы, из которых они получены, но с добавлением исключения в случае, если результирующее значение переполняет значения max или min
Мы можем использовать эти методы как с целыми числами , так и с длинными в качестве параметров.
2.1. Дополнение()
Добавляет два параметра, выбрасывая ArithmeticException в случае переполнения (что относится ко всем *Точный() методы) добавления:
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. 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. Мультипликативный эффект()
Умножьте два параметра, вызывая 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
Второй пример требует объяснения, поскольку это не очевидно: Переполнение происходит из-за Целого числа.MIN_VALUE -2.147.483.648, а с другой стороны Целое число.MAX_VALUE равно 2.147.483.647 , поэтому возвращаемое значение не вписывается в Целое число на одну единицу.
3. Другие Методы
3.1. floorDiv()
Делит первый параметр на второй, а затем выполняет операцию floor() над результатом, возвращая Целое число , которое меньше или равно фактору:
Math.floorDiv(7, 2)); // returns 3
Точное частное равно 3,5, поэтому floor(3.5) .
Давайте рассмотрим другой пример:
Math.floorDiv(-7, 2)); // returns -4
Точное частное равно -3,5, так что этаж(-3,5) == -4.
3.2. modDiv()
Этот метод аналогичен предыдущему методу floorDiv() , но применяет операцию floor() над модулем или остатком деления вместо частного:
Math.modDiv(5, 3)); // returns 2
Как мы видим, modDiv() для двух положительных чисел совпадает с оператором% . Давайте рассмотрим другой пример:
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, а также видел некоторые примеры того, как их использовать.
Как всегда, полный исходный код доступен на GitHub .