【问题标题】:How to convert a list of Strings to a LinkedHashMap?如何将字符串列表转换为 LinkedHashMap?
【发布时间】:2019-07-27 09:57:01
【问题描述】:

我有一个清单:

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

谢谢

【问题讨论】:

  • String::length 返回Integer 不是String
  • 您的意思是将linked 声明为Map<String, Integer>
  • 您能否举例说明您希望 LinkedHashMap 在不同输入列表中的样子?
  • 我的意思是声明 Map @ernest_k
  • 请参阅 OP @dnault

标签: java lambda java-stream linkedhashmap collectors


【解决方案1】:

你错过了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)));

【讨论】:

  • 您好,感谢您的回复。你是对的,我错过了合并语句。我如何为 做到这一点?
  • 您好,再次感谢。错误是什么,Operator '+' cannot be applied to '&lt;lambda parameter&gt;', 'int 不允许将 lambda 表达式与数学运算结合使用?
  • 不,它自己。两个数学运算 n -&gt; n &lt; list.size() //Bad return type in lambda expression: boolean cannot be converted to inn -&gt; n + 2 // Operator '+' cannot be applied to '&lt;lambda parameter&gt;' 出现错误
  • @dk40149 方法 iterate 可从 java9 获得
【解决方案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

【讨论】:

    【解决方案3】:

    这是我对 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-17
      • 2018-05-29
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 2020-06-07
      相关资源
      最近更新 更多