Java 8 Math Новые методы

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.