简体   繁体   中英

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.

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();

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM