Skip to content

对象工具 ObjectUtil

feilong edited this page May 22, 2020 · 1 revision

java 开发接触最多的就是 Object 对象了,目前 Object 提供以下方法

1 T defaultIfNullOrEmpty(final T object,final T defaultValue)

如果 object 是null或者empty,返回默认值 defaultValue.

示例:

 ObjectUtil.defaultIfNullOrEmpty(null, null)      = null
 ObjectUtil.defaultIfNullOrEmpty(null, "")        = ""
 ObjectUtil.defaultIfNullOrEmpty(null, "zz")      = "zz"
 ObjectUtil.defaultIfNullOrEmpty("abc", *)        = "abc"
 ObjectUtil.defaultIfNullOrEmpty(Boolean.TRUE, *) = Boolean.TRUE

说明:

  • 使用该方法,可以简化你的代码
  • 如果使用 import static 的特性,代码会更加简洁
  • 如果你只需要判断 null的场景,你可以使用 ObjectUtils.defaultIfNull(Object, Object)

对下面的代码重构:

 if (isNotNullOrEmpty(defaultReturnResult.getReturnObject())){
     return (String) defaultReturnResult.getReturnObject();
 }else{
     return "redirect:/";
 }

可以重构成:

 return ObjectUtil.defaultIfNullOrEmpty((String) defaultReturnResult.getReturnObject(), "redirect:/");

再比如:

 private void putItemToMap(Map<String, List<Item>> map,String categoryName,Item item){
     List<Item> itemList = map.get(categoryName);

     if (isNullOrEmpty(itemList)){
         itemList = new ArrayList<>();
     }
     itemList.add(item);
     map.put(categoryName, itemList);
 }

可以重构成:

 private void putItemToMap(Map<String, List<Item>> map,String categoryName,Item item){
     List<Item> itemList = ObjectUtil.defaultIfNullOrEmpty(map.get(categoryName), new ArrayList<Item>());
     itemList.add(item);
     map.put(categoryName, itemList);
 }

当然对于上面的case,你还可以直接调用 com.feilong.core.util.MapUtil.putMultiValue(java.util.Map, Object, Object)

2 boolean isArray(Object object)

判断指定的对象 object是否是数组.

说明:

  • 支持判断原始类型数组 primitive 和包装类型数组

示例:

 int[] i = {};
 ObjectUtil.isArray(i);                       =true

 ObjectUtil.isArray(new int[] { 1, 2, 3 });   =true

 ObjectUtil.isArray(new Integer[0]);          =true
 ObjectUtil.isArray(new String[0]);           =true

instanceof和 java.lang.Class.isArray()的区别:

通常使用instanceof操作符去判断一个对象 object 是否是数组 array. 在JVM层次,instanceof操作符 translates to a specific "instanceof" byte code, which is highly optimized in most JVM implementations. 而反射的方法(getClass().isArray()) is compiled to two separate "invokevirtual" instructions. The more generic optimizations applied by the JVM to these may not be as fast as the hand-tuned optimizations inherent in the "instanceof" instruction.

有两种特殊情况: null references 和 primitive arrays.

instanceof getClass().isArray()
null false NullPointerException
原始类型数组primitive array false true

3 boolean isPrimitiveArray(Object object)

判断指定的对象 object 是否是原生类型数组.

示例:

 ObjectUtil.isPrimitiveArray(1)                           = false
 ObjectUtil.isPrimitiveArray(1L)                          = false
 ObjectUtil.isPrimitiveArray("1")                         = false


 ObjectUtil.isPrimitiveArray(new int[] {})                = true
 ObjectUtil.isPrimitiveArray(new int[] { 1, 2 })          = true
 ObjectUtil.isPrimitiveArray(new byte[] { 1, 2 })         = true

 ObjectUtil.isPrimitiveArray(new String[] { "1", "2" })   = false

core

Clone this wiki locally