从try-with-resources到ThreadLocal,优化你的代码编写方式!

简介: 10个Java编码小技巧,涉及到代码复用、异常处理、集合操作、字符串处理等方面。其中包括使用Lambda表达式简化代码、使用try-with-resources自动关闭资源等。

pexels-julian-paolo-dayag-1673973

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变量是独立的,从而避免了线程安全问题。

结尾

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!

相关文章
|
3月前
|
数据库
优化数据加载策略:深入探讨Entity Framework Core中的懒加载与显式加载技术及其适用场景
【8月更文挑战第31天】在 Entity Framework Core(EF Core)中,数据加载策略直接影响应用性能。本文将介绍懒加载(Lazy Loading)和显式加载(Eager Loading)的概念及适用场景。懒加载在访问导航属性时才加载关联实体,可优化性能,但可能引发多次数据库查询;显式加载则一次性加载所有关联实体,减少查询次数但增加单次查询的数据量。了解这些策略有助于开发高性能应用。
49 0
|
4月前
|
存储 缓存 算法
Java面试题:给出代码优化的常见策略,如减少对象创建、使用缓存等。
Java面试题:给出代码优化的常见策略,如减少对象创建、使用缓存等。
63 0
|
4月前
|
算法 Java 测试技术
Java中的代码优化与重构策略
Java中的代码优化与重构策略
ThreadLocal优化,使用ThreadLocal可以提高代码的复用性,感觉比较丢人,ThreadLocal的作用主要是复用代码
ThreadLocal优化,使用ThreadLocal可以提高代码的复用性,感觉比较丢人,ThreadLocal的作用主要是复用代码
|
存储 Java Spring
Spring框架中的Resource接口是什么,以及它在加载和访问资源时的关键作用
使用 Resource 加载资源 要使用 Resource 接口加载资源,首先需要获取一个 ResourceLoader 实例,通常可以通过依赖注入来获得。接下来,您可以使用 ResourceLoader 来获取 Resource 对象,然后使用它来访问资源的内容。
136 0
|
Java 测试技术
深入探索 Java 中的 @Test 注解:优化单元测试流程的利器
在软件开发中,单元测试是保障代码质量和稳定性的重要手段之一。Java 中的 `@Test` 注解则为开发人员提供了一种方便、高效的方式来编写和执行单元测试。通过该注解,我们可以轻松地标记测试方法,自动化运行测试,并确保代码在各种情况下的正确性。本文将带您深入探索 Java 中的 `@Test` 注解,揭示其作用、用法以及在实际开发中的应用场景。
|
存储 Dart Java
Dart内存泄漏示例及如何解决
内存泄漏是指对象被分配了内存空间,但在不再需要这些对象时,它们仍然占用着内存空间而没有被垃圾回收。
Dart内存泄漏示例及如何解决
|
存储 安全 前端开发
【JVM原理探索】你真正掌握了Java对象创建的流程吗?
【JVM原理探索】你真正掌握了Java对象创建的流程吗?
164 0
【JVM原理探索】你真正掌握了Java对象创建的流程吗?
|
Java 编译器 程序员
try with resources简洁的异常捕获机制
try with resources简洁的异常捕获机制
93 0
|
XML Java Maven
一个封装好的dialog工具类,减少重复的代码,简洁又方便使用!
一个封装好的dialog工具类,减少重复的代码,简洁又方便使用!
一个封装好的dialog工具类,减少重复的代码,简洁又方便使用!