Как вернуть целое число, когда карта getOrDefault возвращает объект - PullRequest
1 голос
/ 26 сентября 2019

Допустим, у меня есть конструктор для шины, который принимает два целых числа, pressure и 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;}
}

В моем основном классе я могу добавить новый Tire к HashMapс именем tires с pressure из 25 и maxPressure из 32.

public Map<String, Tire> tires = new HashMap<>;
public int defaultTirePressure = 28;
tires.put("Goodyear", new Tire(25, 30));

Я хочу иметь возможность получить pressure() объекта Tire, если он существует, или использовать 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();

Очевидно, что это не работает, потому что defaultTirePressure является целым числом, а tires содержит Tire объектов.

Это работает, но это довольно долго:

//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;
}

Нет ли способа использовать getOrDefault в этом примере?Я чувствую, что, возможно, ответил на свой вопрос.

Ответы [ 2 ]

4 голосов
/ 26 сентября 2019

Почему бы не предоставить Tire объекту давление по умолчанию в методе getOrDefault в качестве значения по умолчанию

tires.getOrDefault("Michelin", new Tire(25, defaultTirePressure)).getPressure();

Вы также можете иметь объект по умолчанию Tire объект

public final Tire defaultTire = new Tire(25,28);
tires.getOrDefault("Michelin", defaultTire).getPressure();

ИлиВы также можете иметь конструктор с одним аргументом с максимальным давлением для создания deault Tire object

public Tire(int maxPressure) {
   this.maxPressure = maxPressure;
}

public final Tire defaultTire = new Tire(28);
tires.getOrDefault("Michelin", defaultTire).getPressure();
0 голосов
/ 26 сентября 2019

Поскольку HashMap#get() возвращает null для неизвестных ключей, вы можете использовать Optional

final int someTirePressure = Optional.ofNullable(tires.get("Michelin"))
    .map(Tire::getPressure)
    .orElse(defaultTirePressure);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...