Java中的一些编程经验

最近看公司项目,其中能学到很多的编程经验,正好总结学习一下

判空的处理

公司的判空处理,我看每个人都有每个人的喜好,这么多列出来,一看还真不知道这些的区别,正好今天总结学习一下😎:

  • StrUtil.isBlank:这个一看就是处理字符串的,用于检查一个字符串是否为 null、空字符串("")或者只包含空白字符(如空格、制表符、换行符等),注意只包含空格也会别认定为false
  • Objects.nonNull:它是 java.util.Objects 类的一部分。这个方法用于检查一个对象是否不为 null
  • ObjectUtil.isNull:这个也是检查对象是否为空的
  • CollUtil.isNotEmptyCollUtil.isNotEmpty 方法用于检查一个集合是否非空,即集合中至少包含一个元素,这个主要来检查集合的

这么总结一看,发现挺好区分的,字符串和集合都有对应的处理类,然后对象判空的话,两个都可以,看个人喜好了😁😁😁

异步的使用

看公司代码中调用异步任务的时候,使用了自己不熟悉的类,正好来学习总结一下

先学概念

CompletableFuture概念:是 Java 8 中引入的一个类,它是 java.util.concurrent 包的一部分,用于简化异步编程模型。CompletableFuture 提供了一种更加直观的方式来处理异步操作的结果,以及在异步操作完成后执行后续操作。

说人话😭:就是java.util.concurrent 包下的一个用来异步编程的一个类

核心知识

  • 链式调用:支持链式调用,这意味着你可以在异步任务完成后执行其他操作,如处理结果、执行新的异步任务等
  • 线程安全CompletableFuture 的操作是线程安全的,这意味着你可以在多线程环境中安全地使用它。
  • 异步回调CompletableFuture 可以通过 thenAcceptthenRun 方法来定义异步任务完成后的回调操作。

写个Demo

CompletableFuture 的使用示例:

创建一个异步任务:

arduino 复制代码
 CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
     // 异步执行的代码
     return "Hello, World!";
 });

分析:代码中创建一个异步任务,该任务会执行一个 Supplier 函数式接口的实现,这个实现返回一个字符串 "Hello, World!"。supplyAsync 方法会启动一个新的线程来执行这个任务,并且返回一个 CompletableFuture<String> 对象,这个对象代表了异步任务的执行结果。

OK,结束

别走😭,来都来了,多学点:

试试链式调用:

kotlin 复制代码
 future.thenApply(s -> s.toUpperCase())
       .thenAccept(System.out::println)
       .exceptionally(e -> {
           System.err.println("An error occurred: " + e.getMessage());
           return null;
       });

分析thenApply 方法用于指定一个函数,这个函数将异步任务的结果作为输入,并返回一个新的结果。在这个例子中,它将字符串转换为大写。

thenAccept 方法用于指定一个消费者函数,这个函数接受 thenApply 方法的结果,并执行某些操作(在这个例子中是打印字符串)。

exceptionally 方法用于指定一个异常处理器,如果前面的操作(thenApplythenAccept)抛出异常,这个处理器会被调用,打印错误信息。

调用结果

csharp 复制代码
 try {
     String result = future.get();
     System.out.println("Result: " + result);
 } catch (InterruptedException | ExecutionException e) {
     e.printStackTrace();
 }

分析:future.get() 方法用于获取异步任务的结果。这个方法会阻塞当前线程,直到异步任务完成。

如果任务被中断或者执行过程中抛出异常,get 方法会抛出 InterruptedExceptionExecutionException

工程实践

学完了一些基本的,看一下公司代码是怎么写的😶‍🌫️:

scss 复制代码
         CompletableFuture.runAsync(() -> {
             Thread thread = new Thread(uuid) {
                 @Override
                 public void run() {
 ​
                     try {
                         taskContentInfoData(params, uuid, finalInputStream, insertPercent, flDtoList);
                     } catch (Exception exception) {
                         writeJobStatus(uuid, JobStatusEnum.FAIL.getStatus(), null);
                         log.info("错误信息{}", exception);
                         CommonConstants.threadPoolMap.remove(uuid);
                     }
                 }
             };
             thread.start();
         });

也很简单,就是 CompletableFuture.runAsync来异步执行一个 Runnable 对象

分析:公司这里处理的也能达到异步的效果,这个实现的run方法里面,又开启了一个线程,主要是为了设置这个线程的唯一标识,所以有点绕。

顺便复习一下创建线程的几种方式:继承Thread类、实现Runnable接口,线程池创建

其中也可以直接创建Thread类来重写其run方法来创建🙌🙌🙌

相关推荐
JavaGuide几秒前
一条 SQL 语句在 MySQL 中是如何执行的?
java·数据库·后端·mysql
ABin-阿斌21 分钟前
SpringBoot 整合 Easy_Trans 实现翻译的具体介绍
java·spring boot·后端
终末圆35 分钟前
MyBatis XML映射文件编写【后端 18】
xml·java·开发语言·后端·算法·spring·mybatis
_.Switch41 分钟前
Python Web 架构设计与性能优化
开发语言·前端·数据库·后端·python·架构·log4j
2401_857600951 小时前
心理教育辅导系统的设计与Spring Boot实现
java·spring boot·后端
北飞的山羊1 小时前
【计算机网络】详解UDP套接字&网络字节序&IP地址&端口号
linux·服务器·网络·后端·计算机网络·udp·信息与通信
☼YJLH☾1 小时前
第十章,XML
xml·java·后端·intellij-idea
拜见老天師1 小时前
SpringBoot中对数据库连接配置信息进行加密处理
数据库·spring boot·后端
記億揺晃着的那天2 小时前
SpringCloud从零开始简单搭建 - JDK17
java·spring boot·后端·spring cloud·nacos
憨憨憨憨憨到不行的程序员2 小时前
Spring框架基础知识
java·后端·spring