从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


猜你喜欢
- name和value属性的区别从源码可以得知,name是value的别名,value也是name的别名。两者的作用是一致的,name指定Fe
- 环境变量这个概念不陌生, 就是操作系统的环境变量。系统变量就是java本身维护的变量。 通过 System.getProperty 的方式获
- 笔者近2天在 Android Studio上玩了一下百度地图,碰到了常见的"230错误 APP Scode校验失败",下
- Java——获取字符串编码格式判断一个字符串的编码格式: public static St
- 1:和junit一起使用的时候因为没有读取配置文件,所以老是报创建Bean失败,上网查了查,原来是先要读取spring的核心配置文件,这样机
- 在上篇文章给大家介绍了Android Studio 3.6 正式版终于发布了,快来围观,需要的朋友可以点击查看,今天给大家分享我安装Andr
- 一.MyBatis简介1)MyBatis 是一款优秀的持久层框架2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结
- netty心跳机制示例,使用Netty实现心跳机制,使用netty4,IdleStateHandler 实现。Netty心跳机制,netty
- 基于SSM+Mysql+Maven+HTML实现的员工绩效管理系统。该系统只有后台页面,后台前端框架使用的是layui官网推荐后台界面。角色
- 快速排序快速排序是对冒泡排序的一种改进,也是采用分治法的一个典型的应用。JDK中Arrays的sort()方法,具体的排序细节就是使用快速排
- 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后除以10的余数代替该数字,再将第一
- 本文实例讲述了Android中AlertDialog显示简单和复杂列表的方法。分享给大家供大家参考,具体如下:AlertDialog 显示简
- 一般的接口实现多态定义接口 interface Ipeople { void say(); }定义实现的类 public cla
- 一、继承引言继承关系可以对不同模块的依赖版本做统一管理,因为子模块中的依赖基本都继承于父模块,父模块中指定哪个版本,子模块就继承哪个版本,可
- 本文介绍了ListView给每个Item上面的按钮添加事件,具体如下:1.先看下效果图:在这里仅供测试,我把数据都写死了,根据需要可以自己进
- 前言RecyclerView几乎在每个app里面都有被使用,但凡使用了列表就会采用分页加载进行数据请求和加载。android 官方也推出了分
- 场景:最新的leakCanary2.8.1:debugImplementation 'com.squareup.leakcanary
- 本文实例讲述了C#中winform控制textbox输入只能为数字的方法。分享给大家供大家参考。具体实现方法如下:添加keyPress事件,
- 本文实例讲述了C#实现图片切割的方法。分享给大家供大家参考,具体如下:图片切割就是把一幅大图片按用户要求切割成多幅小图片。dotnet环境下
- 由于是多态对象,基类类型的变量可以保存派生类型。 要访问派生类型的实例成员,必须将值强制转换 * 生类型。 但是,强制转换会引发 Invali