要在Java中映射的2个数组。数组值可能包含空元素

要在Java中映射的2个数组。数组值可能包含空元素,java,java-8,Java,Java 8,我有两个数组(大小相同)String[]和Object[]。 问题是:有没有比这更优雅的方式将它们转换为地图 private Map<String, Object> arraysToMap(String[] keys, Object[] values) { Map<String, Object> map = new HashMap<>(); if (keys.length != 0) { for (int i = 0; i &l

我有两个数组(大小相同)
String[]
Object[]
。 问题是:有没有比这更优雅的方式将它们转换为地图

private Map<String, Object> arraysToMap(String[] keys, Object[] values) {
    Map<String, Object> map = new HashMap<>();
    if (keys.length != 0) {
        for (int i = 0; i < keys.length; i++) {
            map.put(keys[i], values[i]);
        }
    }
    return map;
}
private Map arraysToMap(字符串[]键,对象[]值){
Map Map=newhashmap();
如果(keys.length!=0){
for(int i=0;i
也许是Java8风格

重要提示:

  • 可能包含空值
  • 包含非空的唯一元素

要解决此问题,可以使用以下代码:

public class Test {
    static String[] keys = {"String1", "String2"};
    static Object[] values = {new Object(), new Object()};

    public static void main(String[] args) {
        Map<String, Object> map = IntStream.range(0, keys.length)
                .boxed()
                .collect(Collectors.toMap(i -> keys[i], i -> values[i]));
    }
}
公共类测试{
静态字符串[]键={“String1”,“String2”};
静态对象[]值={new Object(),new Object()};
公共静态void main(字符串[]args){
Map Map=IntStream.range(0,keys.length)
.boxed()
.collect(Collectors.toMap(i->key[i],i->value[i]);
}
}

如您所见,首先我创建了从零到
keys.length
的范围,然后我们用相应的对象包装类替换了流的基本值。最后,我们使用了
Collectors.toMap
方法来实际创建地图。还要确保大小相等。

确保大小相等,否则可能会出现
ArrayIndexOutOfBoundsException
问题。如果其中一个值为null,则NPE将失败。发生这种情况是因为数组未初始化。这是一个示例,但请参阅我更新的答案。映射本身支持空值,但HashMap中重写的merge()方法不支持空值<代码>@覆盖公共V合并(K键,V值,BiFunction@AlexMamo您的示例可以使用“dirty hack”进行扩展:(1)以下代码可以工作,因为哈希表的merge()实现接受空值
Map Map=IntStream.range(0,keys.length).boxed().collect(Collectors.toMap(i->keys[i],i->values[i],(v1,v2)->v1,Hashtable::new));Map result=new HashMap(Map);
@NikolayShevchenko对,我应该说得更清楚。我的意思是,你可以构建一个定制的收集器,并提供你想要的合并函数(如果需要的话)