要在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对,我应该说得更清楚。我的意思是,你可以构建一个定制的收集器,并提供你想要的合并函数(如果需要的话)