griffinht
griffinht

Reputation: 43

How to return integer when map getOrDefault return an object

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

Answers (2)

Phil
Phil

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

Ryuzaki L
Ryuzaki L

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

Related Questions