Java学习积累

发布时间 2024-01-10 15:57:31作者: 二十二#4

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

日期时间工具-DateUtil (hutool.cn)

  • 自定义格式字符串转化为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);
		}
});

深拷贝与浅拷贝

Java深入理解深拷贝和浅拷贝区别

在对象进行数据处理时,若有相关的对象进行了引用,实际上只引用了地址,并不是一个新的对象。

对List进行深拷贝

List<JSONObject> filesJson = new ArrayList<>();
CollectionUtils.addAll(filesJson, new Object[allFilesJson.size()]);
Collections.copy(filesJson, allFilesJson);

CharSequenceUtil 字符串判断

CharSequenceUtil (hutool - Gitee.com))

可以对空字符串进行判断

//检查字符串是否为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)