构建一个创建Map的工具类来辅助理解可变传参

简介: 虽说java作为编译语言,但是它本身也提供了很多运行时能力,今天介绍一个非常基础的知识点,可变参数传递在日常的开发过程中,创建Map对象还是比较常见的,现在我希望写一个工具类,可以非常简单创建并初始化Map对象因此我们可以实现一个MapUtil工具类,来支持这个场景

虽说java作为编译语言,但是它本身也提供了很多运行时能力,今天介绍一个非常基础的知识点,可变参数传递


在日常的开发过程中,创建Map对象还是比较常见的,现在我希望写一个工具类,可以非常简单创建并初始化Map对象


因此我们可以实现一个MapUtil工具类,来支持这个场景


public static <K, V> Map<K, V> newMap(K k, V v, Object... kv) {
        Map<K, V> ans = new HashMap<>();
        ans.put(k, v);
        for (int i = 0; i < kv.length; i += 2) {
            ans.put((K) kv[i], (V) kv[1]);
        }
        return ans;
}
复制代码


注意一下上面的实现,kv这个参数就是我们要说的可变参数,在方法内部,kv可以看成是一个数组对象(而且是安全的对象,当不传递时,它的取值也不是null)

在使用可变参数时,下面是一些需要注意的点


可变参数注意与数组参数的冲突


注意下面的两个方法,不能同时出现,直接出现编译错误

public static <K, V> Map<K, V> newMap(K k, V v, Object... kv)
public static <K, V> Map<K, V> newMap(K k, V v, Object[] kv)
复制代码


重载的选择


如果只有一个可变参数的方法,newMap("key", "value")不会报错,会直接访问下面这个方法,kv参数为空数组


public static <K, V> Map<K, V> newMap(K k, V v, Object... kv)
复制代码


当出现重载时,即如下

public static <K, V> Map<K, V> newMap(K k, V v, Object... kv)
public static <K, V> Map<K, V> newMap(K k, V v)
复制代码


上面两个方法的调用,如果传参只有两个时,会调用哪个?


  • newMap("key", "value") 调用的下面的方法
  • `newMap("key", "value", "k", "v") 调用的上面的方法


可变参数传数组会怎样


虽说我们在使用的时候,将可变参数当做数组来使用,但是传递时,若传数组,是否可行呢?


public static <K, V> Map<K, V> newMap(K k, V v, Object... kv) {
  Map<K, V> ans = new HashMap<>();
  ans.put(k, v);
  for (int i = 0; i < kv.length; i += 2) {
    ans.put((K) kv[i], (V) kv[1]);
  }
  return ans;
}
@Test
public void tt() {
  Map map = newMap("key", "value", new Object[]{"1", "2"});
  System.out.println(map);
}
复制代码


实际输出如下

{1=2, key=value}
复制代码


从实际测试来看,传数组并没有问题



相关文章
|
2天前
如何实现数组和 List 之间的转换?
如何实现数组和 List 之间的转换?
|
2天前
|
Java
java8中过滤、获取指定属性转换为集合、字符串拼接、移除某个对象的使用
java8中过滤、获取指定属性转换为集合、字符串拼接、移除某个对象的使用
|
2天前
|
存储 前端开发 Java
Java【代码分享 13】前端动态添加一条记后端使用JDK1.8实现map对象根据key的部分值进行分组(将map对象封装成指定entity对象)
Java【代码分享 13】前端动态添加一条记后端使用JDK1.8实现map对象根据key的部分值进行分组(将map对象封装成指定entity对象)
26 0
|
12月前
|
设计模式 Java
从零开始:Java中如何定义和访问静态字段和方法
从零开始:Java中如何定义和访问静态字段和方法
133 0
|
JavaScript 前端开发 索引
ES6——类数组转换为数组的几种方法以及for of、forin、for Each的区别
类数组转换为数组的几种方法以及for of、forin、for Each的区别
103 0
|
Java
Java Map集合的几种遍历方式与性能对比(包含lambda表达式)
综上所述:第三种遍历方式在数据量非常小时是最好的,第五种遍历方式是最简单粗暴的。
324 0
Java Map集合的几种遍历方式与性能对比(包含lambda表达式)
|
存储 Java
Java基础数组静态和动态初始化时机
Java基础数组静态和动态初始化时机
Java基础数组静态和动态初始化时机
|
设计模式 Java
【伍】一篇让你搞懂Java中的字符串,两种实例化方式的差异以及String常用方法的使用(附示例)
【伍】一篇让你搞懂Java中的字符串,两种实例化方式的差异以及String常用方法的使用(附示例)
171 0
【伍】一篇让你搞懂Java中的字符串,两种实例化方式的差异以及String常用方法的使用(附示例)
|
前端开发 Java 索引
Java 中数组 binarySearch 方法and拷贝对象工具类CopyUtils-可忽略覆盖Null值详解
[1] 该搜索键在范围内,但不是数组元素,由1开始计数,得“ - 插入点索引值”; [2] 该搜索键在范围内,且是数组元素,由0开始计数,得搜索值的索引值; [3] 该搜索键不在范围内,且小于范围(数组)内元素,返回–(fromIndex + 1); [4] 该搜索键不在范围内,且大于范围(数组)内元素,返回 –(toIndex + 1)。
109 0
Java 中数组 binarySearch 方法and拷贝对象工具类CopyUtils-可忽略覆盖Null值详解