我有一个要转换为Map的数组,这样数组中的第一个元素是键,第二个元素是值,依此类推。
我正在尝试以下操作:
Arrays.asList("Tamilnadu", "chennai", "Karnataka", "Bengluru")
.stream()
.collect(HashMap::new,
(a, b) -> a.put(b, ""),//value should be next element in array
(a, b) -> a.putAll(b)
);
我的困惑是如何在同一collection迭代中获取下一个元素,以便执行a.put(b,nextElementToB)
。
有人可以通过使用流来帮助解决此问题,因为我想尝试相同的功能编程吗?迭代将是这样做的唯一方法吗?
答案 0 :(得分:6)
您可以使用IntStream
的索引中的List
:
Map<String,String> map =
IntStream.range(0,list.size()/2)
.boxed()
.collect(Collectors.toMap(i->list.get(2*i),i->list.get(2*i+1)));
这是假设List
具有偶数个元素。
答案 1 :(得分:1)
您可以使用toMap方法
公共静态Map toMap(Object [] array)
将给定的数组转换为Map。数组的每个元素必须为 包含至少两个元素的Map.Entry或Array, 其中第一个元素用作键,第二个元素用作值。
此方法可用于初始化:
//创建一个Map映射颜色。映射colorMap = ArrayUtils.toMap(new 字符串[] [] { {“ RED”,“#FF0000”}, {“ GREEN”,“#00FF00”}, {“ BLUE”,“#0000FF”}});对于空输入数组,此方法返回null。
参数:array-一个数组,其元素为Map.Entry或 包含至少两个元素的数组,可以为空
返回:从数组创建的地图
抛出:IllegalArgumentException-如果此数组的一个元素是 本身是一个包含少于两个元素的数组 IllegalArgumentException-如果数组包含的元素不是 Map.Entry和一个数组
因此您可以按以下方式使用它
Map map = ArrayUtils.toMap(arrayName);
您必须首先从以下位置导入ArrayUtils:
import org.apache.commons.lang3.ArrayUtils;
注意:这不是内置的方法,不是;您需要Apache Commons依赖项!
答案 2 :(得分:0)
流一次只能查看一项,它们彼此独立。这是为了允许并行流可以保留或不保留顺序。
Java Streams不适合您要在此处执行的任务。首先将数据按摩到单个原子对象中。在这种情况下,普通的for循环要么遍历索引,要么使用迭代器。