Java 8 Math New Methods

Java 8 Math Neue Methoden

1. Einführung

Wenn wir über die neuen Funktionen nachdenken, die mit Version 8 von Java geliefert wurden, sind funktionale Programmierung und Lambda-Ausdrücke normalerweise die ersten Dinge, die uns in den Sinn kommen.

Abgesehen von diesen großen Funktionen gibt es noch andere, die möglicherweise eine geringere Auswirkung haben, aber auch interessant sind und oft nicht wirklich bekannt sind oder sogar von einer Rezension abgedeckt werden.

In diesem Tutorial werden wir jede der neuen Methoden, die einer der Kernklassen der Sprache hinzugefügt wurden, auflisten und ein kleines Beispiel geben:java.lang.Math.

2. Neue*exact() Methoden

Erstens haben wir eine Gruppe neuer Methoden, die einige der vorhandenen und am häufigsten verwendeten arithmetischen Operationen erweitern.

Wie wir sehen werden, sind sie ziemlich selbsterklärend, da sie genau die gleiche Funktionalität haben wie die Methoden, von denen sie abgeleitet sind, jedoch mitthe addition of throwing an exception in case, the resulting value overflows the max or min values of their types.

Wir können diese Methoden sowohl mitintegers als auch mitlongs als Parameter verwenden.

2.1. addExact()

Fügt die beiden Parameterthrowing an ArithmeticException in case of overflow (which goes for all *Exact() methods) der Addition hinzu:

Math.addExact(100, 50);               // returns 150
Math.addExact(Integer.MAX_VALUE, 1);  // throws ArithmeticException

2.2. substractExact()

Subtrahiert den Wert des zweiten Parameters vom ersten und wirft bei Überlauf der Subtraktion einArithmeticException:

Math.subtractExact(100, 50);           // returns 50
Math.subtractExact(Long.MIN_VALUE, 1); // throws ArithmeticException

2.3. incrementExact()

Erhöht den Parameter um eins und wirft bei Überlauf einArithmeticException:

Math.incrementExact(100);               // returns 101
Math.incrementExact(Integer.MAX_VALUE); // throws ArithmeticException

2.4. decrementExact()

Dekrementiert den Parameter um eins und wirft bei Überlauf einArithmeticException:

Math.decrementExact(100);            // returns 99
Math.decrementExact(Long.MIN_VALUE); // throws ArithmeticException

2.5. multiplyExact()

Multiplizieren Sie die beiden Parameter und geben Sie bei Überlauf des Produkts einArithmeticException aus:

Math.multiplyExact(100, 5);            // returns 500
Math.multiplyExact(Long.MAX_VALUE, 2); // throws ArithmeticException

2.6. negateExact()

Ändert das Vorzeichen des Parameters und gibt bei Überlauf einArithmeticException aus.

In diesem Fall müssen wir über die interne Darstellung des Werts im Speicher nachdenken, um zu verstehen, warum es zu einem Überlauf kommt, der nicht so intuitiv ist wie die übrigen „exakten“ Methoden:

Math.negateExact(100);               // returns -100
Math.negateExact(Integer.MIN_VALUE); // throws ArithmeticException

Das zweite Beispiel erfordert eine Erklärung, da es nicht offensichtlich ist: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, sodass der zurückgegebene Wert nicht um eine Einheit inInteger passt.

3. Andere Methoden

3.1. floorDiv()

Dividiert den ersten Parameter durch den zweiten und führt dann einefloor()-Operation über das Ergebnis durch, wobei dieInteger zurückgegeben werden, die kleiner oder gleich dem Quotienten sind:

Math.floorDiv(7, 2));  // returns 3

Der genaue Quotient beträgt 3,5, alsofloor(3.5) == 3.

Schauen wir uns ein anderes Beispiel an:

Math.floorDiv(-7, 2)); // returns -4

Der genaue Quotient ist -3,5, alsofloor(-3.5) == -4.

3.2. modDiv()

Diese Methode ähnelt der vorherigen MethodefloorDiv(), wendet jedoch die Operationfloor() über den Modul oder den Rest der Division anstelle des Quotienten an:

Math.modDiv(5, 3));  // returns 2

Wie wir sehen können, sind diemodDiv() for two positive numbers is the same as % operator. Schauen wir uns ein anderes Beispiel an:

Math.modDiv(-5, 3));  // returns 1

Es wird 1 und nicht 2 zurückgegeben, dafloorDiv(-5, 3) -2 und nicht -1 ist.

3.3. nextDown()

Gibt den unmittelbar niedrigeren Wert des Parameters zurück (unterstützt die Parameterfloat oderdouble):

float f = Math.nextDown(3);  // returns 2.9999998
double d = Math.nextDown(3); // returns 2.999999761581421

4. Fazit

In diesem Artikel haben wir kurz die Funktionalität aller neuen Methoden beschrieben, die der Klassejava.lang.Math in Version 8 der Java-Plattform hinzugefügt wurden, und einige Beispiele für deren Verwendung gesehen.

Wie immer ist der vollständige Quellcodeover on GitHub verfügbar.