Java中使用instanceof判断对象类型

记录:470

场景:Java中使用instanceof判断对象类型。例如在解析JSON字符串转换为指定类型时,先判断类型,再定向转换。在List<Object>中遍历Object时,先判断类型,再定向转换。

版本:JDK 1.8,Spring Boot 2.6.3。

一、解析Json字符串时,使用instanceof判断对象类型

场景:在基于微服务开发中,一个请求会贯穿多个微服务,一般在微服务之间传递参数均以JSON字符串为主流。

1.JSON字符串示例

{
  "getTime": "2023-08-13 17:50:12",
  "getValue": [
    "13",
    350,
    193.62,
    37,
    "1813"
  ]
}

解析:在getValue中传递参数,既有字符串、int型、double型等,在把JSON字符串时,无法转为指定类型,只能使用List<Object>类型是最合适。

需求:本例需求场景这些字符必须都转换为Double类型,再放到业务中使用。

2.使用instanceof判断对象类型

public static Double getDouble(Object obj) {
  if (obj == null) return null;
  Double result = null;
  try {
      if (obj instanceof Integer) {
          result = ((Integer) obj).doubleValue();
      } else if (obj instanceof Long) {
          result = ((Long) obj).doubleValue();
      } else if (obj instanceof Double) {
          result = (Double) obj;
      } else if (obj instanceof BigDecimal) {
          result = ((BigDecimal) obj).doubleValue();
      } else if (obj instanceof String) {
          result = Double.parseDouble((String) obj);
      }
  } catch (Exception e) {
      log.info("类型转换异常");
      e.printStackTrace();
  }
  return result;
}

3.测试示例

public static void f1() {
   String result = "{\n" +
           "  \"getTime\": \"2023-08-13 17:50:12\",\n" +
           "  \"getValue\": [\n" +
           "    \"13\",\n" +
           "    350,\n" +
           "    193.62,\n" +
           "    37,\n" +
           "    \"1813\"\n" +
           "  ]\n" +
           "}";
   JSONObject jsonResult = (JSONObject) JSON.parse(result);
   List<Object> listResult = (List<Object>) jsonResult.get("getValue");
   List<Double> listResultD = new ArrayList<>();
   //类型转换
   listResult.forEach(item -> {
       listResultD.add(getDouble(item));
   });
   //遍历结果
   listResultD.forEach(item -> {
       System.out.println("" + item);
   });
}

4.输出结果

执行f1
13.0
350.0
193.62
37.0
1813.0

二、遍历List<Object>时,使用instanceof判断对象类型

场景:在接收到结果集List<Object>时,Object的具体类型由多个时,使用instanceof判断对象类型,再转换增强代码合理性。

1.使用instanceof判断对象类型

public static Double getDouble(Object obj) {
  if (obj == null) return null;
  Double result = null;
  try {
      if (obj instanceof Integer) {
          result = ((Integer) obj).doubleValue();
      } else if (obj instanceof Long) {
          result = ((Long) obj).doubleValue();
      } else if (obj instanceof Double) {
          result = (Double) obj;
      } else if (obj instanceof BigDecimal) {
          result = ((BigDecimal) obj).doubleValue();
      } else if (obj instanceof String) {
          result = Double.parseDouble((String) obj);
      }
  } catch (Exception e) {
      log.info("类型转换异常");
      e.printStackTrace();
  }
  return result;
}

2.测试示例

public static void f2() {
  List<Object> list01 = new ArrayList<>();
  Integer integerV = 813;
  Long longV = 209206L;
  Double doubleV = 209207.13D;
  BigDecimal bigDecimal01 = new BigDecimal("209208.23");
  BigDecimal bigDecimal02 = new BigDecimal("209209");
  String strV = "209210.35";
  list01.add(integerV);
  list01.add(longV);
  list01.add(doubleV);
  list01.add(bigDecimal01);
  list01.add(bigDecimal02);
  list01.add(strV);
  List<Double> list02 = new ArrayList<>();
  //类型转换
  list01.forEach(item -> {
      list02.add(getDouble(item));
  });
  //遍历结果
  list02.forEach(item -> {
      System.out.println("" + item);
  });
}

3.输出结果

执行f2
813.0
209206.0
209207.13
209208.23
209209.0
209210.35

以上,感谢。

2023年8月13日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,可以使用instanceof关键字来判断一个对象是否属于某个特定的类型。当使用instanceof时,如果对象是指定类型或其子类的实例,则返回true,否则返回false。这个操作符通常用于类型检查和向下转型操作。例如,可以使用instanceof判断一个Animal对象是否是Dog类的实例。在示例代码,Animal类是一个基类,而Dog类是Animal类的子类。通过使用instanceof关键字,可以判断Animal对象是否是Dog类的实例,并进行相应的操作。\[1\]另外,在Java,所有的类都会隐式继承Object类,所以在使用instanceof时,也可以判断一个对象是否是Object类的实例。\[2\]这个操作符在反序列化时也经常使用,用于判断对象是否属于指定的类型,以避免ClassCastException异常的抛出。\[3\] #### 引用[.reference_title] - *1* [Java使用instanceof判断对象类型](https://blog.csdn.net/pan_junbiao/article/details/84970068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [教妹学Java判断对象类型instanceof关键字](https://blog.csdn.net/qing_gee/article/details/117591805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值