如何将字符串列表转换为LinkedHashMap?

问题描述 投票:0回答:3

我有一个清单:

private List <String> list;

我想将它转换为LinkedHashMap(以保持顺序),这样地图中的前两个值是LinkedHashMap条目,依此类推,直到列表是LinkedHashMap:

private LinkedHashMap<String, String> linked;

这就是我想出的。不可否认,我是收藏家实施的新手,所以请耐心等待:

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

这在LinkedHashMap构造函数行上给出了一个错误:

Cannot resolve constructor of LinkedHashMap

这是列表的外观示例:

zero
test0
one
test1
two
test2

我希望地图看起来像什么:

zero:test0
one:test1
two:test2

谢谢

java lambda java-stream linkedhashmap collectors
3个回答
2
投票

为什么你的代码复杂化,在你的情况下一个简单的循环解决问题:

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
投票

你错过了merge function

合并函数,用于解决与同一个键关联的值之间的冲突,提供给Map.merge(Object,Object,BiFunction)

但是要使用stream api用预期值填充地图,你可以使用forEach方法和java9中的IntStream::iterate

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)));

0
投票

这是我用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));
© www.soinside.com 2019 - 2024. All rights reserved.