#java #map #properties
#java #словарь #свойства
Вопрос:
Кто-нибудь может предоставить мне лучший способ, чем приведенный ниже, для преобразования объекта карты Java в объект свойств?
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("key", "value");
Properties properties = new Properties();
for (Map.Entry<String, String> entry : map.entrySet()) {
properties.put(entry.getKey(), entry.getValue());
}
Спасибо
Комментарии:
1. Возможно, этот вопрос лучше подходит для проверки кода
Ответ №1:
Использовать Properties::putAll(Map<String,String>)
метод:
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("key", "value");
Properties properties = new Properties();
properties.putAll(map);
Комментарии:
1. Из javadocs: Их использование настоятельно не рекомендуется, поскольку они позволяют вызывающей стороне вставлять записи, ключи или значения которых не являются строками. Кроме того, если на карте есть ключи, которые имеют нулевые значения, это приведет к NPE.
Ответ №2:
вы также можете использовать apache commons-collection4
org.apache.commons.collections4.MapUtils#toProperties(Map<K, V>)
пример:
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("name", "feilong");
map.put("age", "18");
map.put("country", "china");
Properties properties = org.apache.commons.collections4.MapUtils.toProperties(map);
смотрите javadoc
Ответ №3:
Вы можете сделать это с помощью конфигурации Commons:
Properties props = ConfigurationConverter.getProperties(new MapConfiguration(map));
Комментарии:
1. @Reg Просто используйте версию 2.7?
2. Те же проблемы: Пожалуйста, смотрите mvnrepository.com/artifact/org.apache.commons /…
3. @Reg Это вводит в заблуждение, уязвимости влияют только на необязательные или тестовые зависимости конфигурации Commons. Эти зависимости не извлекаются автоматически в ваш проект, когда вы зависите от конфигурации Commons. Например, конфигурация Commons может использоваться с Spring Framework, но она не будет использовать Spring для вас, вы должны сами объявить зависимость с правильной версией.
4. Хахахаха — Мне было интересно, почему вы так привязаны к этому, я вижу, вы являетесь участником проекта! (Хорошо сделано и спасибо) Я удалил свой первый комментарий, но я чувствую, что это важная информация, которую следует учитывать любому пользователю. Короче говоря, для всех, кто читает это, проверьте свою версию и убедитесь, что вы не обнаруживаете никаких уязвимостей 🙂
Ответ №4:
Попробуйте MapAsProperties
из Cactoos:
import org.cactoos.list.MapAsProperties;
import org.cactoos.list.MapEntry;
Properties pros = new MapAsProperties(
new MapEntry<>("foo", "hello, world!")
new MapEntry<>("bar", "bye, bye!")
);
Ответ №5:
Я почерпнул идею из этой статьи, но я изменил преобразование из карты в свойства. Это необходимо, если вам может потребоваться манипулировать входными данными.
Map<String,String> input = System.getenv();
Properties output = input.entrySet().stream().collect(
Collectors.toMap(
e -> String.valueOf(e.getKey()),
e -> String.valueOf(e.getValue()),
(prev, next) -> next, Properties::new
)
);
Также, если вы хотите отфильтровать значения с карты.
Map<String,String> input = System.getenv();
Properties output = input.entrySet()
.stream().filter(e -> e.getKey().startsWith("XYZ")).collect(
Collectors.toMap(
e -> String.valueOf(e.getKey()),
e -> String.valueOf(e.getValue()),
(prev, next) -> next, Properties::new
)
);