Перейти к основному содержимому

Новые математические методы Java 8

· 3 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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 .