Подтвердить что ты не робот

Использование lambda для форматирования карты в строку

У меня есть карта с ключами и значениями Integer. Мне нужно преобразовать его в String с этим конкретным форматом: key1 - val1, key2 - val2, key3 - val3. Теперь я использую forEach для форматирования каждого элемента, сбора их в List и последующего выполнения String.join();

List<String> ships = new ArrayList<>(4);
for (Map.Entry<Integer, Integer> entry : damagedMap.entrySet())
{
    ships.add(entry.getKey() + " - " + entry.getValue());
}
result = String.join(",", ships);

Есть ли более короткий способ сделать это? И было бы хорошо сделать это с лямбдой, потому что мне нужна практика, использующая лямбды.

4b9b3361

Ответ 1

Я думаю, что вы ищете что-то вроде этого:

import java.util.*;
import java.util.stream.*;
public class Test {

    public static void main(String[] args) throws Exception {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "foo");
        map.put(2, "bar");
        map.put(3, "baz");
        String result = map.entrySet()
            .stream()
            .map(entry -> entry.getKey() + " - " + entry.getValue())
            .collect(Collectors.joining(", "));
        System.out.println(result);
    }
}

Чтобы пройти через бит в свою очередь:

  • entrySet() получает итеративную последовательность записей
  • stream() создает поток для этого итеративного
  • map() преобразует этот поток записей в поток строк формы "ключ-значение"
  • collect(Collectors.joining(", ")) объединяет все записи в потоке в одну строку, используя ", " в качестве разделителя. Collectors.joining - это метод, который возвращает Collector, который может работать во входной последовательности строк, давая результат одной строки.

Обратите внимание, что порядок здесь не гарантируется, потому что HashMap не упорядочен. Вы можете использовать TreeMap для получения значений в порядке нажатия клавиш.