#java
Вопрос:
Мне нужно извлечь 2 переменные среды из системных переменных, которые заканчиваются определенной строкой. Строки-это ПОРТ и ХОСТ. Например, у меня есть следующие переменные:
TEST_SERVICE1_PORT = 80
TEST_SERVICE1_HOST = 0.0.0.0
TEST_SERVICE2_PORT = 78
TEST_SERVICE2_HOST = 1.1.1.1
TEST_SERVICE3_PORT = 90
TEST_SERVICE3_HOST = 2.2.2.2
TEST_SERVICE4_PORT = 100
TEST_SERVICE4_HOST = 3.3.3.3
Плюс другие системные переменные
Вот что я могу сделать:
var map = System.getenv().entrySet().stream()
.filter(x -> x.getKey().endsWith(serviceName "_PORT" ) || x.getKey().endsWith(serviceName "_HOST"))
.collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
// serviceName is a custom input
Например, если имя службы равно SERVICE1, то на карте будут первые 2 переменные.
С этой карты мне нужно получить значение ПОРТА и ХОСТА.
Как я могу это сделать? Нужно ли мне снова фильтровать полученную карту или есть лучший способ? Заранее спасибо за вашу помощь
Комментарии:
1. Не могли бы вы, пожалуйста, добавить вывод
System.out.println(System.getenv());
У меня такое чувство, что эти переменные env недоступны для вашего приложения2. Это фиктивные значения, но я проверил, что результирующая карта содержит эти значения, если я добавлю ее вручную.
3. Как вы можете использовать
var
ключевое слово, когда вы используете[java-8]
?4. Можете ли вы полагаться на предположение, что фильтр проходят только две записи? Затем вы можете использовать что-то вроде
System.getenv().entrySet().stream() .filter(x -> { String k = x.getKey(); return (k.endsWith("_PORT" ) || k.endsWith("_HOST")) amp;amp; k.regionMatches(k.length() - serviceName.length() - 5, serviceName, 0, serviceName.length()); }) .collect(Collectors.toMap(x -> x.getKey().substring(x.getKey().length() - 4), Map.Entry::getValue))
того, что всегда будет создавать карту с ключами"PORT"
и"HOST"
.5. Важнейшей частью является использование
x -> x.getKey().substring(x.getKey().length() - 4)
в качестве ключевой функции дляtoMap
использования только последних четырех символов. Конечно, когда вы не можете полагаться на уникальный префикс, нет никакого способа обойти другую операцию для идентификации существующего префикса. Кроме того, я просто переписал фильтр, чтобы избежать объединения строк для каждого теста ввода.