Reputation: 43
Let's say I have a constructor for a tire that takes two integers, pressure
and maxPressure
public class Tire {
private int pressure;
private int maxPressure;
public Tire(int pressure, int maxPressure){
this.pressure = pressure;
this.maxPressure = maxPressure;
}
public int getPressure(){return pressure;}
public int getMaxPressure(){return maxPressure;}
}
In my main class I can add a new Tire
to a HashMap
called tires
with a pressure
of 25 and maxPressure
of 32.
public Map<String, Tire> tires = new HashMap<>;
public int defaultTirePressure = 28;
tires.put("Goodyear", new Tire(25, 30));
I want to be able get the pressure()
of the Tire
object if it exists or use the defaultTirePressure
//should be 25
tires.getOrDefault("Goodyear", defaultTirePressure).getPressure();
//should be 28 because there is no Michelin tire defined in tires
tires.getOrDefault("Michelin", defaultTirePressure).getPressure();
Obviously this does not work because defaultTirePressure
is an integer and tires
contains Tire
objects.
This works, but it is kind of long:
//will set someTirePressure to 25
if(tires.containsKey("Goodyear")){
someTirePressure = tires.getValue("Goodyear").getPressure();
}else{
someTirePressure = defaultTirePressure;
}
//will set anotherTirePressure to 28 because there is no Michelin tire defined in tires
if(tires.containsKey("Michelin")){
anotherTirePressure = tires.getValue("Goodyear").getPressure();
}else{
anotherTirePressure = defaultTirePressure;
}
Is there no way to use getOrDefault in this example? I feel I may have answered my own question.
Upvotes: 1
Views: 579
Reputation: 164897
Since HashMap#get()
returns null
for unknown keys, you could use an Optional
final int someTirePressure = Optional.ofNullable(tires.get("Michelin"))
.map(Tire::getPressure)
.orElse(defaultTirePressure);
Upvotes: 0
Reputation: 40078
Why not provide Tire
object with default pressure in getOrDefault
method as a default value
tires.getOrDefault("Michelin", new Tire(25, defaultTirePressure)).getPressure();
You can also have default Tire
object
public final Tire defaultTire = new Tire(25,28);
tires.getOrDefault("Michelin", defaultTire).getPressure();
Or you can also have single argument constructor with max pressure to create deault Tire
object
public Tire(int maxPressure) {
this.maxPressure = maxPressure;
}
public final Tire defaultTire = new Tire(28);
tires.getOrDefault("Michelin", defaultTire).getPressure();
Upvotes: 4