首页 > 编程语言 >Java学习积累

Java学习积累

时间:2024-01-10 16:01:54浏览次数:45  
标签:积累 00 Java String JSONObject List 学习 字符串 null

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)

标签:积累,00,Java,String,JSONObject,List,学习,字符串,null
From: https://www.cnblogs.com/twenty-two/p/17956670

相关文章

  • 分布式机器学习的故事:Docker改变世界
    分布式机器学习的故事:Docker改变世界Docker最近很火。Docker实现了“集装箱”——一种介于“软件包”和“虚拟机”之间的概念——并被寄予厚望,以期革新Internet服务以及其他大数据处理系统的开发、测试、和部署流程。为了使用Docker,需要了解不少工具及其设计思路;而这些工具的文......
  • SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/......
  • go的gin框架学习以及初始化---安装篇
    1.编辑器使用vscode设置中文,加载go语言相关插件  https://code.visualstudio.com/2.下载go运行环境  https://go.dev/dl/3.新建项目目录binpkgsrc(项目目录可存放多个项目) 每个项目文件下必须要有go.mod文件4.引入gin如果超时先设置goenv-wGO111MODULE......
  • 2024年1月Java项目开发指南1:环境与工具准备
    准备工作基础能力开发能力的事咱先不谈,有两个基础技能要学一下。1.学习使用Markdown编写文档2.学会使用git拉取代码和提交代码软件准备电脑需要安装以下软件:IDEA2023.2及其以上(Java开发统一使用IDEA)Webstorm2023.2及其以上(也可以使用VScode或者Hbuilder或者Dreamweav......
  • 2024年1月Java项目开发指南2:项目设计
    确定软件架构1.前端用什么技术,什么框架,什么版本2.后端用什么技术,什么框架,什么版本3.用些什么软件,软件版本?比如:前端:vue3+Element-Plus+Axios后端:Java17SpringbootMyBatis-plusMaven3数据库:MySQL5.5后端开发工具:IDEA2023.2.2前端开发工具:Webstorm2023.2.2接口管理......
  • 【JavaScript】JavaScript定义、引入方式、基础语法、函数、对象、继承
    定义JavaScript是一门跨平台、面向对象的脚本语言用来控制网页行为的,可以使网页交互引入方式内部脚本外部脚本JS基础语法书写语法输出语句变量变量作用域数据类型运算符=====??.?...展开运算符(1)打散数组传递给多个参数(2)复制数组或......
  • Java SMTP发送邮件有什么好处?实现方式?
    在当今数字化时代,电子邮件成为人们日常生活和工作中不可或缺的沟通工具。为了在Java应用程序中实现邮件发送功能,使用SMTP(SimpleMailTransferProtocol)是一种常见的选择。本文将探讨在Java中使用SMTP发送邮件的好处,并介绍其实现方式。1.简介:JavaSMTP发送邮件的背景在开始深入讨......
  • springboot学习日记(八)
    前后端分离的项目static目录下一般不存放东西。static目录下的图片等资源默认做了映射,直接在localhost:8080下访问即可。表单中的enctype属性决定了服务器对表单数据的编码,将该属性设置成form-data时可以通过filename找到路径,用content-type设置内容格式来上传文件。可使用Multi......
  • Java Spring Boot Controller、Service、DAO实践
    如果你用过SpringMVC,那就对Controller、Service、DAO三者的概念一定不陌生,我们通过Controller来接收请求和返回响应,具体的业务处理则放在Service层处理,而DAO则实现具体与数据库等持久层的操作。今天从分层的角度来学习下在SpringBoot中的简单应用,业务场景也很简单,就......
  • Markdowm学习
    makdown学习标题:三级标题四级标题字体HelloWorld!HelloWould!HelloWould!HelloWould!引用每个牛逼人物背后都有段苦逼的岁月,只要像sb一样的坚持,终将牛b!分割线图片![图片1](C:\Users\86150\Pictures\Screenshots\屏幕截图2023-12-07090508.png)超链接[点击跳转......