Java 11 Массив строк для карты позиции массива, строка

У меня есть массив строк, которые я хочу преобразовать в карту. Без использования AtomicInteger или стороннего API.

образец:

final String[] strings = new String[]{"Arsenal", "Chelsea", "Liverpool"};

final Map<Integer, String> map = new HashMap<>();
for (int i = 0; i < strings.length; i++) {
    map.put(i, strings[i]);
}

System.out.println(map);

каков наилучший и лаконичный способ добиться этого с помощью потокового API?


person Giuseppe Adaldo    schedule 16.10.2019    source источник
comment
Я не думаю, что этот вопрос связан с этой проблемой вообще   -  person Giuseppe Adaldo    schedule 17.10.2019


Ответы (1)


Изучив его, я нашел 2 возможных решения:

final Map<Integer, String> map = IntStream.rangeClosed(0, strings.length - 1)
        .mapToObj(i -> new SimpleEntry<>(i + 1, strings[i]))
        .collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue));

И:

final Map<Integer, String> map = IntStream.rangeClosed(0, strings.length - 1)
        .boxed()
        .collect(toMap(i -> i + 1, i -> strings[i]));

Где мне не нужно создавать экземпляр AbstractMap.SimpleEntry

Любое лучшее решение? Есть ли какой-нибудь совет, какой из них лучше?

person Giuseppe Adaldo    schedule 16.10.2019
comment
.....mapToObj(i -> Map.entry(i + 1, strings[i])) в Java-9 выше... хотя и не обязательно - person Naman; 16.10.2019
comment
Или без накладных расходов на бокс, IntStream.range(0, strings.length) .collect(HashMap::new, (m,i) -> m.put(i+1, strings[i]), Map::putAll) - person Holger; 23.10.2019
comment
О, отлично, это более элегантное решение - person Giuseppe Adaldo; 24.10.2019