2016-04-26 5 views
-1

Ich versuche herauszufinden, wie man am besten die kleinste von zwei Zahlen ergreift, wenn die Zahlen Attribute innerhalb von zwei verschiedenen Objekten sind. Jeder, aber nicht beide der Objekte können null sein, was zu Nullzeigerausnahmen führen kann. Jedes Objekt verfügt über eine eigene getValue() -Methode, die einen Long-Wert zurückgibt. Es ist die grundlegende if/else, dass ich lieber nicht tun sollten:java finde die kleinste von zwei Zahlen, die von zwei verschiedenen Objekttypen kommen, wenn man null sein kann

if (obj1 != null && obj2 != null) { // neither object is null 
    minValue = obj1.getValue() <= obj2.getValue() ? obj1.getValue() : obj2.getValue(); 
} else if (obj1 == null && obj2 != null) { // only obj1 is null 
    minValue = obj2.getValue(); 
} else { // only obj2 is null (they can't both be null, so we don't need an if for the situation where they're both null) 
    minValue = obj1.getValue(); 
} 

Ich habe versucht, ein paar andere Dinge:

// can throw null pointer exception 
Collections.min(Arrays.asList(obj1.getValue(), obj2.getValue())); 

// while both objects have a getValue() method, they are of different types, so mapping doesn't work 
Collections.min(Arrays.asList(obj1, obj2) 
    .filter(obj -> obj != null) 
    .map(obj -> obj.getValue()) // this line will fail since the methods correspond to different objects 
    .collect(Collectors.toList())); 

ich so das Gefühl, ein ziemlich einfaches Problem sein sollte, aber mein das Gehirn lässt es nicht funktionieren. Es gibt eine Min-Funktion, in der Sie eine Situation bipassieren können, in der das Objekt null sein kann.

+1

Was der Typ (en) von 'value'? –

+0

Sie sind vom Typ Long – user2869231

+0

Warum nicht einfach die NullPointerException abfangen? –

Antwort

2
long minValue = Math.min(obj1 == null ? Long.MAX_VALUE : obj1.getValue(), 
         obj2 == null ? Long.MAX_VALUE : obj2.getValue()); 
+0

Was ist wenn 'x .getValue() == null'? –

+0

Ratten! Genau wie ich das gleiche Ding eintippte! –

+1

@ BoristheSpider sollte es nicht, nach dem OP. Das wird also eine NPE werfen und die Vorbedingungsverletzung signalisieren. –

0

Ich bin nicht sicher, ob ich völlig verstehe Ihre Frage, aber wenn ich es tue, so etwas wie dies funktionieren könnte:

if(obj1 == null) 
    minValue = obj2.getValue(); 
else if(obj2 == null) 
    minValue = obj1.getValue(); 
else minValue = obj1.getValue() < obj2.getValue() ? obj1.getValue() : obj2.getValue(); 
0

Sie eine Methode haben könnte, die in Ihrem ObjType macht, macht sie NULL-Prüfung und gibt Long.MAX_VALUE oder den Wert zurück, wenn es null ist.

public Long getVal(ObjType val) 
{ 
    if(val != null) 
    { 
     return val.getValue(); 
    } 
    return Long.MAX_VALUE; 
} 

tun dann

Math.min(obj1, obj2); 
+0

Objekte sind nicht identisch – mariusz2108

Verwandte Themen