記錄: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日