Java学习积累
对象判空
在判断获取的信息是否为空时需要注意字段类型的区别
-
如果是String类型变量需要采用
string == null
StrUtil.isEmpty(string)
StringUtils.isEmpty
- 一种是JDK String包中的内容
- 一种是Springboot中的内容(可能5.3版本之后这个方法就没有用了)
-
在判断是否为空时需要注意 == null 一般是判断对象是否存在,如果不存在则对象为null
-
而使用
StrUtil.isEmpty
时public static boolean isEmpty(CharSequence str) {
`return str == null || str.length() == 0;`
}
进行了两种类型的判断,一种是判断对象是否存在,另一种是判断字符串长度是否为0。
[CharSequenceUtil](##CharSequenceUtil 字符串判断) : 可以用来对字符串类型进行判断
-
如果是基本数据类型则采用 类似
sysInfo.getId() != null
-
List类型判空
List<SysUser> sysUser = list(new QueryWrapper<SysUser>().lambda
.eq(SysUser::getId, Id));
sysUser == null
判断无效!sysUser.isEmpty
正确判断!
-
实体类对象判空
- 实体类对象 == null
selectOne 和 getOne
-
对于期望获取单条记录的情况,建议使用 getOne,因为它更简洁易读。
-
但是,如果不确定查询是否会返回多条记录,或者需要处理未返回记录的情况,则可能希望使用 selectOne 并检查返回的列表的大小。
数据相等判断
-
字符串判断
String a = "你好"; //true System.out.println(a.equal("你好")); //或者使用工具类 ObjectUtils.equal(a, "你好") //当String对象可能为null时 使用工具类或者固定字符串在前 "你好".equal(a)
-
流判断数据是否存在
boolean hasStatus = record.stream().anyMatch(f -> f.getStatus() == 0)
-
List集合中存在某个值
List<Long> longList = new ArrayList(); longList.add(1L); longList.add(2L); //true System.out.println(longList.contains(1L));
JSON类型转换
-
实体类转JSON
String entityObjectString = JSON.toJSONString(entityObject); JSONObject entityInfo = JSONObject.parseObject(entityObjectString); 简化: JSONObject entityInfo = JSONObject.parseObject(JSON.toJSONString(entityObject));
-
字符串转JSON
JSONObject entityInfo = JSONObject.parseObject(entityObjectString);
JSON.parseObject(String text, Class clazz)
,作用就是将指定的JSON字符串转换成自己的实体类的对象。- 将对象转化成JSON字符串时,对于JSON字符串有,但是Test类没有的,不做任何处理。
- 将JSON字符串转化成对象时,会去填充名称相同的属性,对于JSON字符串中没有,而Test类中有的属性,会为null;
-
LIST转JSONarray(JSONarray转jsonObject)
JSONArray jsonArray = JSONArray.parseArray(JSONObject.toJSONString(sysUser));
JSONObject json = JSONObject.to("array", jsonArray);
- JSONarray处理
jsonArray.getJSONObject(finalI).get("id")
jsonArray.getJSONObject(finalI).put("id", 123456L);
需要修改参数:
for (int i = 0; i < jsonArray.size(); i++) {
int finalI = i;
sysUser.stream().filter(f -> f.getBusId().equals(jsonArray.getJSONObject(finalI).get("id"))).findFirst().ifPresent(t -> {
jsonArray.getJSONObject(finalI).put("id", 123456L);
});
}
无需修改参数:
for (Object a : jsonArray) {
JSONObject record = JSONObject.parseObject(JSONObject.toJSONString(a));
}
- List
转
List<TemProjectTree> proTree = treeArray.stream().map(m -> m.to(TemProjectTree.class)).collect(Collectors.toList());
HuTool工具类 DateUtil
-
自定义格式字符串转化为Date
//20230201 : 2023-02-01 00:00:00 Date date1 = DateUtil.parse("20230201", "yyyyMMdd"); System.out.println("20230201 : " + date1); //2023-08-01 00:00:00 Date date2 = DateUtil.parse("2023-08", "yyyy-MM"); System.out.println("2023-08 : " + date2);
-
String转化为Date/Date转化为String
//2023-08 Str : 2023-08-01 00:00:00 Date date = DateUtil.parse("2023-08", "yyyy-MM"); String formatDateTime = DateUtil.formatDateTime(date); System.out.println("2023-08 Str : " +formatDateTime);
-
月份(初始-结束)
//beginOfMonth : 2023-08-01 00:00:00 //endOfMonth : 2023-08-31 23:59:59 Date date = DateUtil.parse("2023-08", "yyyy-MM"); Date beginOfMonth = DateUtil.beginOfMonth(date); Date endOfMonth = DateUtil.endOfMonth(date); System.out.println("beginOfMonth : " + beginOfMonth); System.out.println("endOfMonth: " +endOfMonth);
-
常见的时间格式转化Date -> String
//常用格式的格式化,结果:2017-03-01 String formatDate = DateUtil.formatDate(date); //结果 2017/03/01 String format = DateUtil.format(date, "yyyy/MM/dd"); //结果:00:00:00 String formatTime = DateUtil.formatTime(date);
文件路径
- 涉及到文件路径时 带/为相对路径不带/为绝对路径, 若不带/ (绝对路径)上测试环境服务器会出现找不到文件的情况。
对List数据先排序后分组
由于在myBatisPlus中groupBy和orderByDesc 分组和排序操作执行顺序为先分组后排序,在面对一些特定情况时无法做到先排序后分组的情况,所以先用查询语句排序查询出来,再用流操作对List进行去重。
List<SysFile> newVersionFiles = uidLists.isEmpty() ? new ArrayList<>() : sysFileService.lambdaQuery()
.eq(SysFile::getIsFlag, 1)
.in(SysFile::getAid, uidLists)
.orderByDesc(SysFile::getFileVersion).list();
if (!newVersionFiles.isEmpty()) {
newVersionFiles = newVersionFiles.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(SysFile::getAid))), ArrayList::new));
}
流去重的原理为将list放入一个set中对某个值进行比较
TreeSet对于重复元素的保留方式是留下先add的,抛弃后add的
因此排序过得list可以将实现分组效果
上面的根据元素属性去重方法是:
1.将list存为TreeSet,并使用Comparator.comparing指定比较的元素为某个属性。
2.将不重复的TreeSet集合转回List
解决FastJson中“$ref 循环引用检测”的问题的几种方式
[解决FastJson中“$ref 循环引用检测”的问题的几种方式-阿里云开发者社区 (aliyun.com)](https://developer.aliyun.com/article/1111191#:~:text=如果循环引用的数据,前端用不到,那可以在实体类对应的字段加注解禁止序列化,这样前端就不会接收到这个字段的引用数据了。 @JSONField (serialize %3D,false) private List orderList%3B 这样在转换的时候,orderList就不会被转换了。)
遇到List类型时:
JSONArray.parseArray(JSON.toJSONString(fileList, SerializerFeature.DisableCircularReferenceDetect))
在遇到实体类对象时 new一个对象,重新赋值
sysUser.forEach(f -> {
if (userId.contains(f.getId())) {
//取出用新对象放入list中 否则回显有问题
SysUser sysUser = new SysUser();
BeanUtils.copyProperties(f, sysUser);
pactList.add(sysUser);
}
});
深拷贝与浅拷贝
在对象进行数据处理时,若有相关的对象进行了引用,实际上只引用了地址,并不是一个新的对象。
对List进行深拷贝
List<JSONObject> filesJson = new ArrayList<>();
CollectionUtils.addAll(filesJson, new Object[allFilesJson.size()]);
Collections.copy(filesJson, allFilesJson);
CharSequenceUtil 字符串判断
可以对空字符串进行判断
//检查字符串是否为null、空白串、“null”、“undefined”
CharSequenceUtil.isBlankOrUndefined();
//检查字符串是否为null、“null”、“undefined”
CharSequenceUtil.isNullOrUndefined();
//检查字符串是否为null、“”、“null”、“undefined”
CharSequenceUtil.isEmptyOrUndefined();
流处理学习
定时执行任务
@Scheduled(cron = "0 0 0 * * ?")
将List处理为分页形式(调用Hutool工具类)
根据传入页码和每页条目数,返回该页拥有的所有数据(第一页的页码取决于PageUtil.getFirstPageNo(),默认为0)
//将处理过的数据拼装成分页形式
List<Map<String, Object>> listUtil = ListUtil.page(current - 1, size, useList);
page.setRecords(listUtil);
page.setSize(size);
page.setCurrent(current);
page.setTotal(useList.size());
XML中IN操作
List<String> applyFormatList = StringUtils.isEmpty(jsonObject.getString("applyFormat")) ? new ArrayList<>() : Arrays.asList(jsonObject.getString("applyFormat").split(";"));
jsonObject.put("applyFormat", applyFormatList);
对前端传的字符串类型进行分割转化为List形式,将List放入JSONObject中
<!--实施项目类型-->
<if test="query.useInfo != null and !query.useInfo.isEmpty()">
AND bp.use_info in
<foreach collection="query.useInfo" close=")" index="idx" item="useInfo" open="(" separator=",">
#{useInfo}
</foreach>
</if>
collection 集合
close 结束时拼接的字符串
open 开始时拼接的字符串
item 元素
separator 分隔符号
或者通过字符串判断
AND INSTR(#{query.useInfo}, ui.use_info)
克隆对象
ObjectUtil.cloneByStream(obj)
标签:积累,00,Java,String,JSONObject,List,学习,字符串,null
From: https://www.cnblogs.com/twenty-two/p/17956670