2017-12-26 3 views
2
OptionalInt max=IntStream.of(arr).max(); 

ODERUnterschied zwischen OptionalInt und Int in Java?

int maximum=0; 
for (int i:arr) { 
    maximum=Math.max(i,maximum); 
} 

Beide Methoden geben Maximalwert! Was macht OptionsInt aus? Gemäß der Definition von "OptionalInt" gibt der Wert "falls vorhanden" getasIntValue() zurück, aber wenn kein Wert vorhanden ist, wird Exception ausgelöst.

Antwort

2

Der Vorteil, den Strom Ansatz über den Imperativ Ansatz besteht darin, dass, wenn es keine Elemente in dem Array sind arr dann stellen wir den Maximalwert als abwesendeinen fehlenden Wert anzuzeigen.

in Bezug auf diese Beschreibung, die Sie erwähnt haben:

Gemäß der Definition von OptionalInt, wenn der Wert, falls vorhanden gibt es getasIntValue(), aber wenn der Wert nicht vorhanden ist, wirft es Ausnahme.

Beachten Sie, dass es eine Ausnahme nur wirft, wenn Sie getAsInt() direkt von einem optionalen Ergebnis nennen, und der Wert ist abwesend.

Dies ist eine gute Sache in dem Sinne, dass, wenn wir versuchen, auf das Element mit getAsInt() zugreifen, wie Sie erwähnt haben, und es keinen Wert vorhanden ist, wird eine NoSuchElementException geworfen und tatsächlich eine Ausnahme erhalten, in diesem Fall , könnte nützlich sein, weil Sie jetzt wissen, dass kein Wert vorhanden ist, während der imperative Ansatz dazu führen könnte, einen Fehler zu verstecken, denn wenn das Array leer ist, ist der Maximalwert 0, was falsch ist, außer in einem bestimmten Szenario in meinem vorletzten Absatz unten.

Solcher, kleiner Code, wie Sie gezeigt haben, wird wahrscheinlich leicht zu beheben sein, wenn es einen Fehler gibt, aber im Produktionscode, kann es schwierig sein, wegen der Größe der Codebasis zu finden.

wenn 0 ist in der Tat wollen der Standard Sie bieten, wenn das Array leer ist, dann können Sie mit dem Imperativ Ansatz vorgehen oder den optionalen Ansatz es getan werden könnte wie:

int max = IntStream.of(arr).max() 
        .orElse(0); 

Im obigen Szenario wird die NoSuchElementException Ausnahme nicht ausgelöst. Außerdem würde ich empfehlen, getAsInt() nicht direkt von einem optionalen Ergebnis zu verwenden, es sei denn, Sie sind 100% sicher, dass das Array nicht leer ist. Verwenden Sie lieber orElse, orElseGet oder orElseThrow, je nachdem, welche Sie für die gegebene Situation am geeignetsten finden.

+0

Ja, das stimmt. Ich habe eine große Codebasis, mehrere Liste oder Liste Typ werden immer gefüllt und wenn sie null sind, wollen wir im Grunde diese Liste oder Array zu können. Ich dachte, der beste Ansatz wäre 'Optional.ofNullable (Produktliste) .orElseThrow (e-> e.emptyList()). Stream.foreach (e-> e.getId());' –

3

Wenn in Ihrem ersten Snippet leer ist, gibt es keinen Maximalwert. Die OptionalInt wäre leer (d.h. sie würde keinen Wert enthalten).

Wenn in Ihrem zweiten Snippet leer ist, ist das Maximum standardmäßig 0.

die Logik des ersten Schnipsel Implementierung ohne OptionalInt kann unter Verwendung eines Integer Variable erfolgen, die einen null Wert enthalten:

Integer maximum = null; 
for (int i:arr) { 
    maximum = maximum != null ? Math.max(i,maximum) : i; 
} 

Jetzt maximum wird null bleiben, wenn arr leer.

+1

@AniketSahrawat Ich verstehe nicht, was Sie sagen wollen. – Eran

1

Der Unterschied ist, dass wenn leer ist, max "leer" sein wird, während Maximum 0 ist, was technisch falsch ist.

Verwandte Themen