我有一个清单:
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
谢谢
为什么你的代码复杂化,在你的情况下一个简单的循环解决问题:
for (int i = 0; i < list.size(); i += 2) {
linked.put(list.get(i), list.get(i + 1));
}
输出
zero:test0
one:test1
two:test2
你错过了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)));
这是我用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));