переменная среды java fetch, заканчивающаяся определенной строкой

#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 использования только последних четырех символов. Конечно, когда вы не можете полагаться на уникальный префикс, нет никакого способа обойти другую операцию для идентификации существующего префикса. Кроме того, я просто переписал фильтр, чтобы избежать объединения строк для каждого теста ввода.