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

时间:2019-03-05 20:37:38

标签: java lambda java-stream linkedhashmap collectors

我有一个列表:

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

这是列表的示例:

zero
test0
one
test1
two
test2

以及我想要的地图外观:

zero:test0
one:test1
two:test2

谢谢

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您错过了merge function

  

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

但是要使用流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)));

答案 2 :(得分: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));