Как преобразовать список строк в LinkedHashMap? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть список:

private List <String> list;

Я хочу преобразовать его в LinkedHashMap (чтобы сохранить порядок), чтобы первые два значения на карте были записью LinkedHashMapи так далее, пока список не станет LinkedHashMap:

private LinkedHashMap<String, String> linked;

Это то, что я придумал.По общему признанию, я новичок в реализации Collectors, так что терпите меня:

            linked = list.stream()
                .collect(Collectors.toMap(
                        Function.identity(),
                        String::valueOf, //Used to be String::length
                        LinkedHashMap::new));

, это дает мне ошибку в строке конструктора LinkedHashMap:

Cannot resolve constructor of LinkedHashMap

Thisпример того, как может выглядеть список:

zero
test0
one
test1
two
test2

и как я хочу, чтобы карта выглядела:

zero:test0
one:test1
two:test2

Спасибо

Ответы [ 3 ]

2 голосов
/ 05 марта 2019

Почему вы усложняете свой код, простая петля в вашем случае решит проблему:

for (int i = 0; i < list.size(); i += 2) {
    linked.put(list.get(i), list.get(i + 1));
}

Quick, Ideone demo

Выходы

zero:test0
one:test1
two:test2
0 голосов
/ 08 марта 2019

Это моя попытка с Java 8.

   IntStream.range(0, list.size())
            .mapToObj(index -> {
                    if (index % 2 == 0) {
                        return new AbstractMap.SimpleImmutableEntry<>(list.get(index), list.get(index + 1));
                    }
                    return null;
                }
            )
            .filter(Objects::nonNull)
            .collect(Collectors.toMap(AbstractMap.SimpleImmutableEntry::getKey, AbstractMap.SimpleImmutableEntry::getValue));
0 голосов
/ 05 марта 2019

Вы пропустили функцию слияния :

функцию слияния, используемую для разрешения коллизий между значениями, связанными с одним и тем же ключом, как указано в Map.merge (Object, Object,BiFunction)

Но чтобы заполнить карту ожидаемыми значениями с использованием потокового API, вы можете использовать метод forEach и IntStream::iterate из java9

LinkedHashMap<String, String> linked = new LinkedHashMap<>();

IntStream.iterate(0, n -> n < list.size(), n -> n + 2)
        .forEach(i -> linked.put(list.get(i), list.get(i + 1)));
...