最近看公司项目,其中能学到很多的编程经验,正好总结学习一下
判空的处理
公司的判空处理,我看每个人都有每个人的喜好,这么多列出来,一看还真不知道这些的区别,正好今天总结学习一下😎:
StrUtil.isBlank
:这个一看就是处理字符串的,用于检查一个字符串是否为 null、空字符串("")或者只包含空白字符(如空格、制表符、换行符等),注意只包含空格也会别认定为falseObjects.nonNull
:它是java.util.Objects
类的一部分。这个方法用于检查一个对象是否不为null
ObjectUtil.isNull
:这个也是检查对象是否为空的CollUtil.isNotEmpty
:CollUtil.isNotEmpty
方法用于检查一个集合是否非空,即集合中至少包含一个元素,这个主要来检查集合的
这么总结一看,发现挺好区分的,字符串和集合都有对应的处理类,然后对象判空的话,两个都可以,看个人喜好了😁😁😁
异步的使用
看公司代码中调用异步任务的时候,使用了自己不熟悉的类,正好来学习总结一下
先学概念
CompletableFuture
概念:是 Java 8 中引入的一个类,它是 java.util.concurrent
包的一部分,用于简化异步编程模型。CompletableFuture
提供了一种更加直观的方式来处理异步操作的结果,以及在异步操作完成后执行后续操作。
说人话😭:就是java.util.concurrent
包下的一个用来异步编程的一个类
核心知识
- 链式调用:支持链式调用,这意味着你可以在异步任务完成后执行其他操作,如处理结果、执行新的异步任务等
- 线程安全 :
CompletableFuture
的操作是线程安全的,这意味着你可以在多线程环境中安全地使用它。 - 异步回调 :
CompletableFuture
可以通过thenAccept
、thenRun
方法来定义异步任务完成后的回调操作。
写个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
方法用于指定一个异常处理器,如果前面的操作(thenApply
或 thenAccept
)抛出异常,这个处理器会被调用,打印错误信息。
调用结果:
csharp
try {
String result = future.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
分析:future.get()
方法用于获取异步任务的结果。这个方法会阻塞当前线程,直到异步任务完成。
如果任务被中断或者执行过程中抛出异常,get
方法会抛出 InterruptedException
或 ExecutionException
。
工程实践
学完了一些基本的,看一下公司代码是怎么写的😶🌫️:
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方法来创建🙌🙌🙌