Нові методи математики Java 8

1. Вступ

Зазвичай, коли ми замислюємось про нові функції, що поставляються з версією 8 Java, функціональне програмування та лямбда-вирази - це перше, що спадає на думку.

Тим не менше, крім цих великих функцій, є й інші, можливо, що мають менший вплив, але також цікаві і багато разів не дуже відомі або навіть охоплені будь-яким оглядом.

У цьому підручнику ми перерахуємо та подамо невеликий приклад кожного з нових методів, доданих до одного з основних класів мови: java.lang.Math .

2. Нові * точні () методи

По-перше, ми маємо групу нових методів, які розширюють деякі існуючі та найпоширеніші арифметичні операції.

Як ми побачимо, вони цілком зрозумілі, оскільки вони мають абсолютно однакову функціональність, ніж методи, з яких вони походять, але з додаванням викиду у випадку, якщо отримане значення перевищує значення max або min їх типів .

Ми можемо використовувати ці методи як цілі числа, так і довготи як параметри.

2.1. addExact ()

Додає два параметри, викидаючи ArithmeticException у разі переповнення (що стосується всіх методів * Exact () ) додавання:

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

Другий приклад вимагає пояснення, оскільки це не очевидно: переповнення відбувається через Integer.MIN_VALUE, що становить -2.147.483.648, а з іншого боку Integer.MAX_VALUE становить 2.147.483.647, тому повернене значення не вписується в ціле число на одну одиницю.

3. Інші методи

3.1. floorDiv ()

Ділить перший параметр на другий, а потім виконує операцію 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. 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 f = Math.nextDown(3); // returns 2.9999998 double d = Math.nextDown(3); // returns 2.999999761581421

4. Висновок

У цій статті ми коротко описали функціональність усіх нових методів, доданих до класу java.lang.Math у версії 8 платформи Java, а також побачили кілька прикладів їх використання.

Як завжди, повний вихідний код доступний на GitHub.