如:Person對象為:{name:"浩二", age:24, weight:null, height:114},那返回給前端的就為{name:"浩二", age:24, height:114}。
如果這個時候有個需求:
? Integer類型的字段為null給-1
? Long類型的字段為null給-1L
? String類型的字段為null給""(空字符串)
? 對象類型的字段為null給new對象,
不能直接動框架,因此需要手動轉(zhuǎn)化。
?
代碼寫死轉(zhuǎn)換
示例
轉(zhuǎn)換對象 ConvertNullFiledInfo:
@Data public class ConvertNullFiledInfo { ? private Integer intNum; ? private Long longNum; ? private String str; ? private ConvertNullFiledInfo info; ? }
轉(zhuǎn)換代碼:
@Service public class ConvertNullFiledService { ? /** * 寫死代碼的方式一個一個字段來轉(zhuǎn)換 * @param info * @return */ public ConvertNullFiledInfo convertFunction01(ConvertNullFiledInfo info) { info.setIntNum(info.getIntNum() == null ? -1 : info.getIntNum()); info.setLongNum(info.getLongNum() == null ? -1L : info.getLongNum()); info.setStr(info.getStr() == null ? "" : info.getStr()); info.setInfo(info.getInfo() == null ? new ConvertNullFiledInfo() : info.getInfo()); return info; } }
測試代碼:
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; ? ? @SpringBootTest @RunWith(SpringRunner.class) public class ConvertNullFiledServiceTest { ? @Autowired private ConvertNullFiledService convertNullFiledService; ? @Test public void convertFunction01() { // str和info字段給null ConvertNullFiledInfo info = createConvertNullFiledInfo(1, 1L, null, null); ConvertNullFiledInfo result = convertNullFiledService.convertFunction01(info); System.out.println(result); } ? /** * 自定義字段創(chuàng)建ConvertNullFiledInfo * @param intNum * @param longNum * @param str * @param info * @return */ private ConvertNullFiledInfo createConvertNullFiledInfo(Integer intNum, Long longNum, String str, ConvertNullFiledInfo info) { ConvertNullFiledInfo result = new ConvertNullFiledInfo(); result.setIntNum(intNum); result.setLongNum(longNum); result.setStr(str); result.setInfo(info); return result; } }
運行結(jié)果:
可以看到是正常轉(zhuǎn)換了的
問題點
這樣寫雖然簡單方便,但是如果有非常多的對象需要轉(zhuǎn)換,就會有許多重復(fù)代碼;
而且如果字段有修改(類型、名稱、被刪除、新增),就需要在去轉(zhuǎn)換方法中修改,因此可以用更好的方式。
?
遍歷Filed轉(zhuǎn)換
所有對象都有Class<T>類,而Class有g(shù)etDeclaredFields()方法,能獲取到所有字段(filed),
因此可以使用這種方式來轉(zhuǎn)換。
示例
轉(zhuǎn)換代碼:
/** * 遍歷field的方式一個一個字段來轉(zhuǎn)換 * @param info * @return */ public ConvertNullFiledInfo convertByField(ConvertNullFiledInfo info) { try { Field[] fields = info.getClass().getDeclaredFields(); for (Field field : fields) { // 設(shè)置可訪問私有變量 field.setAccessible(true); // 獲取當前字段值 Object value = field.get(info); // value不為空就跳過 if (value != null) { continue; } // 獲取當前字段類型 Class<?> type = field.getType(); if (type == Integer.class) { // Integer類型就設(shè)置為-1 field.set(info, -1); } else if (type == Long.class) { // Long類型就設(shè)置為-1L field.set(info, -1L); } else if (type == String.class) { // String類型就設(shè)置為“” field.set(info, ""); } else if (type == ConvertNullFiledInfo.class) { // ConvertNullFiledInfo類型就設(shè)置為新對象 field.set(info, new ConvertNullFiledInfo()); } } } catch (Exception e) { e.printStackTrace(); } return info; }
測試代碼:
@Test public void convertByField() { // str和info字段給null ConvertNullFiledInfo info = createConvertNullFiledInfo(1, 1L, null, null); ConvertNullFiledInfo result = convertNullFiledService.convertByField(info); System.out.println(result); }
運行結(jié)果:
可以看到也是成功轉(zhuǎn)換了
問題點
這種寫法仍然存在問題,可以看到方法的傳參和返回值都是固定類型為ConvertNullFiledInfo,
并且在遍歷field的時候,也有if判斷是寫定的ConvertNullFiledInfo,
因此也在一定程度上寫死了代碼
優(yōu)化
為了避免寫死的情況,可以使用泛型來寫
轉(zhuǎn)換代碼:
@Service public class ConvertNullFiledService<T> { /** * 使用泛型,遍歷field的方式一個一個字段來轉(zhuǎn)換 * @param object * @return */ public T convertByFieldGeneric(T object) { try { Field[] fields = object.getClass().getDeclaredFields(); for (Field field : fields) { // 設(shè)置可訪問私有變量 field.setAccessible(true); // 獲取當前字段值 Object value = field.get(object); // value不為空就跳過 if (value != null) { continue; } // 獲取當前字段類型 Class<?> type = field.getType(); if (type == Integer.class) { // Integer類型就設(shè)置為-1 field.set(object, -1); } else if (type == Long.class) { // Long類型就設(shè)置為-1L field.set(object, -1L); } else if (type == String.class) { // String類型就設(shè)置為“” field.set(object, ""); } else if (type == object.getClass()) { // T類型就設(shè)置為新對象 Object newObj = object.getClass().newInstance(); field.set(object, newObj); } } } catch (Exception e) { e.printStackTrace(); } return object; } }
測試代碼:
@Test public void convertByFieldGeneric() { // 全部字段給null ConvertNullFiledInfo info = createConvertNullFiledInfo(null, null, null, null); ConvertNullFiledInfo result = (ConvertNullFiledInfo) convertNullFiledService.convertByFieldGeneric(info); System.out.println(result); }
運行結(jié)果:
文章來源:http://www.zghlxwxcb.cn/news/detail-477139.html
成功轉(zhuǎn)換文章來源地址http://www.zghlxwxcb.cn/news/detail-477139.html
到了這里,關(guān)于Java對象中轉(zhuǎn)換空值的字段的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!