从try-with-resources到ThreadLocal,优化你的代码编写方式
作者:不一样的科技宅 发布时间:2023-11-11 03:19:52
标签:try-with-resources,ThreadLocal,优化代码
1. 使用try-with-resources简化文件读取操作:
修改前:
FileInputStream fis = null;
try {
fis = new FileInputStream("file.txt");
// ...
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
修改后:
try (FileInputStream fis = new FileInputStream("file.txt")) {
// ...
} catch (IOException e) {
e.printStackTrace();
}
2. 使用Lambda表达式简化集合操作:
修改前:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
for (String name : names) {
System.out.println(name);
}
修改后:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
3. 使用StringBuilder类拼接字符串:
修改前:
String s = "";
for (int i = 0; i < 10; i++) {
s += i;
}
修改后:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb.append(i);
}
String s = sb.toString();
4. 使用静态导入简化代码:
修改前:
System.out.println(Math.sqrt(2));
修改后:
import static java.lang.Math.sqrt;
System.out.println(sqrt(2));
5. 使用断言简化调试:
修改前:
if (x < 0) {
throw new IllegalArgumentException("x must be non-negative");
}
修改后:
assert x >= 0 : "x must be non-negative";
6. 使用Optional类处理可能为空的对象:
修改前:
String s = null;
if (s != null) {
System.out.println(s.length());
}
修改后:
Optional<String> optional = Optional.ofNullable(null);
optional.ifPresent(s -> System.out.println(s.length()));
7. 使用枚举类替代常量:
修改前:
public static final int STATUS_NEW = 0;
public static final int STATUS_PROCESSING = 1;
public static final int STATUS_COMPLETED = 2;
修改后:
public enum Status {
NEW,
PROCESSING,
COMPLETED
}
8. 使用自定义异常类替代通用异常类:
修改前:
try {
// ...
} catch (Exception e) {
e.printStackTrace();
}
修改后:
try {
// ...
} catch (MyCustomException e) {
e.printStackTrace();
}
9. 使用Lambda表达式和Stream API简化集合操作:
修改前:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = new ArrayList<>();
for (int number : numbers) {
if (number % 2 == 0) {
evenNumbers.add(number);
}
}
修改后:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
10. 使用ThreadLocal避免线程安全问题:
修改前:
public class MyRunnable implements Runnable {
private int count = 0;
public void run() {
for (int i = 0; i < 100000; i++) {
count++;
}
System.out.println(count);
}
}
修改后:
public class MyRunnable implements Runnable {
private ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0;
}
};
public void run() {
for (int i = 0; i < 100000; i++) {
count.set(count.get() + 1);
}
System.out.println(count.get());
}
}
在多线程环境下,使用普通的成员变量会导致线程安全问题,而使用ThreadLocal可以确保每个线程访问的变量是独立的,避免了线程安全问题。在上面的示例中,使用ThreadLocal确保了每个线程访问的count变量是独立的,从而避免了线程安全问题。
来源:https://juejin.cn/post/7219467857649221688
0
投稿
猜你喜欢
- 在看别人的关于CopyOnWriteArrayList 这个类的时候,看到有人提出了关于:数组拷贝的方法Arrays.copyOf() 的问
- 题目:给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路
- Class.forName(xxx.xx.xx) 返回的是一个类一.首先你要明白在java里面任何class都要装载在虚拟机上才能运行。1.
- java有两种类型的classload,一种是user-defined的,一种是jvm内置的bootstrap class loader,所
- 1 自定义类加载器自定义类加载器的代码很简单,只需要继承ClassLoader类,覆写findClass方法即可其默认实现是会抛出一个异常:
- 有人问我,怎么判断一个点是不是在多边形内,本来想着把这个多边形分成一个又一个三角形,如图, 然后判断这个点是不是在某个三角形中,如
- 参数和返回值得加密目的为了保证接口不被人拦截下来恶意请求,保证程序的稳定性,我们可以使用接口加密的方法来保证参数和返回值的保密性。具体实现方
- 准备:wildfly/tomcat或者其他服务器你的数据库的Driver,(此处用的mysql-connecter-java-5.1.39-
- 前言回想一下,在学Java时接触的正则表达式,其实Kotlin中也是类似。只不过使用Kotlin 的语法来表达,更为简洁。正则(Regex)
- Android指定SnackBar在屏幕的位置Snackbar 常以一个小的弹出框的形式,出现在手机屏幕下方或者桌面左下方,并且是在屏幕所有
- 1、什么是 ThreadLocal:ThreadLocal,即线程本地变量,如果你创建了一个变量,那么访问这个变量的每个线程都会有这个变量的
- springboot嵌套子类使用在实际项目里,我们会使用到一个User用户含有子类Address、这种嵌套子类在开发中会遇到很多问题,现在主
- 具体可见http://developer.android.com/tools/debugging/ddms.html。 DDMS为IDE和e
- using System; using System.Collections.Generic; using System.Text; usi
- Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object的wait()方法,Conditi
- 背景在接口请求过程中,传递json对象,springboot转换为实体VO对象后,所有属性都为null。post请求:后台接收请求:当时就懵
- 1.概述在本教程中,我们将讨论如何使用Spring Security OAuth和Spring Boot实现SSO - 单点登录。我们将使用
- 背景最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上
- 您已经看到很多包含视频内容的应用程序,比如带有视频教程的食谱应用程序、电影应用程序和体育相关的应用程序。您是否想知道如何将视频内容添加到您的
- 静态库和动态库的区别1、静态库的扩展名一般为".a"或者".lib";动态库的扩展名一般为"