Java 8 Уточнение лямбда-карты <String, List <String>> в строку с требованием ключа карты - PullRequest
0 голосов
/ 14 ноября 2018

Ключами карты могут быть значения 1 - 5, где каждый ключ не требуется, но если он отсутствует, необходимо объединить что-то, похожее на «- []».

Я немного использовал Java 8раньше, и я чувствую, что это можно сделать более эффективно с помощью stream () и collect (), но я чувствую, что требование внешнего списка отбрасывает меня.Приведенный ниже код работает, но кажется неправильным.

List<String> ids = Arrays.asList("1", "2", "3", "4", "5");

StringBuilder location = new StringBuilder();

ids.forEach(id -> {
    List<String> addresses = map.get(id);
    if (addresses != null) {
        addresses.forEach(addr -> location.append(addr + " - "));
    } else {
        location.append(" [] - ");
    }
});

Создает что-то похожее на местоположение в Колорадо:

US - CO - [] - CENTENNIAL -

В ответ Николасу K пример карты будет

{1=[US], 2=[CO], 5=[METROPOLITAN FOOTBALL STADIUM DISTRICT, REGIONAL TRANSPORTATION DISTRICT]}

и ожидается, что он получит вывод

US - CO - [] - [] - METROPOLITAN FOOTBALL STADIUM DISTRICT - REGIONAL TRANSPORTATION DISTRICT

Ответы [ 4 ]

0 голосов
/ 14 ноября 2018

Правильный способ обработки пропущенных значений на карте - computeIfAbsent(), который является новым методом для Map, доступным после Java 8.

Это дает вам следующий код:

String s = ids.stream()
    .map(id -> map.computeIfAbsent(id, absentKey -> singletonList("[]")))
    .flatMap(Collection::stream)
    .collect(Collectors.joining(" - "));
  • Сначала рассмотрим ключи на карте, которые вы сохранили в переменной списка ids.
  • Затем, если значение равно нулю, mapк значению по умолчанию ("[]"), иначе computeIfAbsent() возвращает фактическое значение.
  • Поскольку вы хотите напечатать все значения, разделенные " - ", давайте просто отобразим поток списков и объединим их" - ".

s теперь содержит значение (если используется с вашей картой-примером):

"US - CO - [] - [] - METROPOLITAN FOOTBALL STADIUM DISTRICT - REGIONAL TRANSPORTATION DISTRICT"

Обратите внимание, что нет трейлинга " - ".Collectors.joining() позволяет не добавлять разделитель до или после элементов.

0 голосов
/ 14 ноября 2018

Более простой подход:

    ids.stream().map(l -> map.get(Integer.parseInt(l))).forEach(i -> {
        if (i != null) {
            location.append(i + " - ");
        } else {
            location.append("[] - ");
        }
    });

Здесь мы перебираем каждый элемент в списке, чтобы увидеть, присутствует ли он в качестве ключа на карте. В зависимости от значения мы добавляем соответствующие строки .

Примечание:

Разбор выполнен, если ваша карта определена как Map<Integer, String>

0 голосов
/ 14 ноября 2018

Возможно не очень чисто, но вы можете попробовать:

Map<String, List<String>> inputMap = Map.of("1", List.of(), "2", List.of("l1", "l2"));
List<String> ids = List.of("1", "2", "3", "4", "5");
StringBuilder location = new StringBuilder();
ids.forEach(id -> {
    if (inputMap.get(id) != null) {
        location.append(inputMap.get(id).stream().map(addr -> addr + " - ").collect(Collectors.joining()));
    } else {
        location.append(" [] - ");
    }
});
0 голосов
/ 14 ноября 2018

Я использую Stream и Optional для обработки null ссылок:

List<String> result = ids.stream()
  .map(index -> format(map.get(index)))
  .collect(Collectors.toList());
System.out.println(result);

И метод format:

  private static String format(List<String> address) {
    return Optional.ofNullable(address)
      .map(a -> a.stream().map(part -> Optional.ofNullable(part).orElse("[]")).collect(Collectors.joining(" - ")))
      .orElse(" [] - ");
  }

Применительно к примеру:

  public static void main(String[] args) {
    Map<String, List<String>> map = Map.of("1", Arrays.asList("US", "CO", null, "CENTENNIAL"));

    List<String> ids = Arrays.asList("1", "2", "3", "4", "5");

    List<String> result = ids.stream()
      .map(index -> format(map.get(index)))
      .collect(Collectors.toList());
    System.out.println(result);
  }

Это печатает:

[US - CO - [] - CENTENNIAL,  [] - ,  [] - ,  [] - ,  [] - ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...