Как получить значение из необязательной карты?

#java #java-8 #maps

#java #java-8 #Карты

Вопрос:

У меня короткий вопрос. Как я могу получить значение из необязательной карты?

В foreach (fuelTypesFromDriveTrain.forEach …) Я хочу извлечь значения из карты:

  • Строковое значение = fuelTypesMap.get(fuelTypeFromDriveTrain.GetType());

Но я не знаю, как получить к ним доступ, и я думаю, причина в том, что моя карта является необязательной. Есть идеи?

   // the map 
  final Optional<Map<String, String>> fuelTypesMap = extractAttributeElementValueMap(fuelTypeAttributes);

  final Set<FuelType> fuelTypesFromDriveTrain = getFuelTypesFromDriveTrain(driveTrain);

 if (refueling.getTypes().isEmpty() amp;amp; !fuelTypesFromDriveTrain.isEmpty()) {
            Set<String> fuelTypesKeys = new HashSet<>();
            fuelTypesMap.map(Map::keySet)
                    .map(Collection::stream)
                    .orElseGet(Stream::empty)
                    .forEach(fuelTypeKey -> fuelTypesKeys.add(fuelTypeKey));

            fuelTypesFromDriveTrain.forEach(fuelTypeFromDriveTrain -> {
                if(fuelTypesKeys.contains(fuelTypeFromDriveTrain.getType())) {
                       String value = fuelTypesMap.get(fuelTypeFromDriveTrain.getType());
                       // I cannot obtain the value from the map
                     
                       refueling.getTypes().add(value);
                }
            });
        }
  

Комментарии:

1. Если вы знаете, что она не пуста, вы можете использовать get , чтобы просто получить карту. В противном случае вы можете использовать .map(m -> m.get(key)) для получения Optional<String>

2. @user Спасибо!

3. Вы также можете легко работать с Map<String, String>> definitiveFuelTypeMap = fuelTypesMap.orElse(Collections.emptyMap()); ним, если не хотите его изменять. Вопрос, который нужно задать себе — каким должно быть поведение, если необязательный элемент отсутствует, и далее, если ключ отсутствует на карте.

Ответ №1:

Проверьте приведенный ниже код

 fuelTypesFromDriveTrain.forEach(fuelTypeFromDriveTrain -> {
            fuelTypesMap.map(dataMap->dataMap.get(fuelTypeFromDriveTrain.getType()))
                    .ifPresent(value->refueling.getTypes().add(value));
        });