有没有一种方法可以将Array转换为Map?

时间:2018-06-24 13:08:32

标签: java java-8 java-9 java-10

我有一个要转换为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)

有人可以通过使用流来帮助解决此问题,因为我想尝试相同的功能编程吗?迭代将是这样做的唯一方法吗?

3 个答案:

答案 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循环要么遍历索引,要么使用迭代器。