我有一个列表:
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
谢谢
答案 0 :(得分:2)
为什么要使代码复杂化,您需要一个简单的循环来解决问题:
for (int i = 0; i < list.size(); i += 2) {
linked.put(list.get(i), list.get(i + 1));
}
输出
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));