在 Java 8 和 11 中编写高质量代码的 20 个基本技巧

345 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情

如果您正在使用 Java 8 或 Java 11,并且您是 Java 开发的新手,那么前 20 个 Java 编码技巧可以帮助您编写更好的代码,或者至少让您了解可以使用哪些 Java 功能来解决常见问题。

以下是使用 Java 8 或 11 编写优质高效代码的前 20 条技巧。

  1. 使用for-each 循环遍历集合和数组。这是自 Java 5 以来就可用的功能。
int[] arr = {1, 2, 3};  
for (int num : arr) {  
System.out.println(num);  
}
  1. 使用try-with-resources语句自动关闭资源,例如文件读取器和套接字。这个特性是在 Java 7 中引入的。
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {  
String line;  
while ((line = reader.readLine()) != null) {  
System.out.println(line);  
}  
} catch (IOException e) {  
// handle exception  
}
  1. 使用以有效且有效的方式处理数据。此功能是在 Java 8 中引入的。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream()
    .filter(num -> num % 2 == 0)
    .forEach(System.out::println);

4.使用Optional类避免空指针异常。此功能是在 Java 8 中引入的。

Optional<String> optional = Optional.ofNullable(getString());  
if (optional.isPresent()) {  
System.out.println(optional.get());  
}
  1. 使用lambda 表达式定义匿名函数。此功能是在 Java 8 中引入的。
Thread thread = new Thread(() -> System.out.println("Hello, World!"));  
thread.start();
  1. 使用方法引用来引用现有方法。此功能是在 Java 8 中引入的。
List<String> list = Arrays.asList("apple", "banana", "cherry");  
list.forEach(System.out::println);
  1. 使用功能接口定义功能行为。此功能是在 Java 8 中引入的。
Converter<String, Integer> converter = Integer::valueOf;  
Integer num = converter.convert("123");  
System.out.println(num);
  1. 使用日期和时间 API改进日期和时间处理。此功能是在 Java 8 中引入的。
LocalDate date = LocalDate.now();  
System.out.println(date);  
LocalTime time = LocalTime.now();  
System.out.println(time);  
LocalDateTime dateTime = LocalDateTime.now();  
System.out.println(dateTime);
  1. 使用 @FunctionalInterface注解指定功能接口。此功能是在 Java 8 中引入的。
@FunctionalInterface
interface MyFunction {
    void apply();
}
  1. 使用Base64 类对Base64 数据进行编码和解码。此功能是在 Java 8 中引入的。
String text = "Hello, World!";
byte[] data = text.getBytes();
String encoded = Base64.getEncoder().encodeToString(data);
System.out.println(encoded);
byte[] decoded = Base64.getDecoder().decode(encoded);
  1. 使用var关键字声明具有推断类型的变量。这个特性是在 Java 11 中引入的。还没有被大家广泛使用!
var list = Arrays.asList("apple", "banana", "cherry");

  1. 使用switch带有字符串对象的语句。此功能在 Java 7 中引入并在 Java 14 中得到改进。仅在较少情况下使用Switch 。
String fruit = "apple";  
switch (fruit) {  
case "apple":  
System.out.println("This is an apple.");  
break;  
case "banana":  
System.out.println("This is a banana.");  
break;  
default:  
System.out.println("This is not a fruit.");  
}

13.使用List.of()工厂方法创建一个不可变(unmodifiable)列表。此功能是在 Java 9 中引入的。

List<String> list = List.of("apple", "banana", "cherry");
  1. 使用Map.of()Map.ofEntries()工厂方法创建不可变映射。此功能是在 Java 9 中引入的。
Map<String, Integer> map = Map.of("apple", 1, "banana", 2, "cherry", 3);
  1. 使用该Records功能以最少的样板代码创建数据类。这个特性是在 Java 14 中引入的。这很酷吧。
record Point(int x, int y) {}
Point p = new Point(1, 2);

16.使用Parallel Streams并行执行操作。此功能允许您将大量数据拆分为较小的块并同时处理它们,这可以显着提高代码的性能。

List<String> list = Arrays.asList("apple", "banana", "cherry");  
list.parallelStream()  
.filter(s -> s.startsWith("a"))  
.forEach(System.out::println);
  1. 使用Predicate功能接口创建一个可重用的功能来测试给定的输入是否满足特定条件。
Predicate<Integer> isEven = x -> x % 2 == 0;  
System.out.println(isEven.test(4));
  1. 使用Consumer功能接口创建一个可重用的功能,对给定的输入执行操作。
Consumer<String> printUpperCase = s -> System.out.println(s.toUpperCase());  
printUpperCase.accept("Hello World!");
  1. 使用Supplier功能接口创建一个可重用的函数,该函数无需接受任何输入即可返回一个值。
Supplier<LocalDateTime> now = LocalDateTime::now;  
System.out.println(now.get());
  1. 使用StringBuilder类而不是使用+运算符连接字符串。使用运算符连接字符串+每次都会创建一个新的字符串对象,这在频繁执行或处理大量数据时效率低下。该类StringBuilder允许您通过重用单个对象并向其附加新字符来高效地构建字符串。
StringBuilder sb = new StringBuilder();  
sb.append("Hello");  
sb.append(" ");  
sb.append("World!");  
System.out.println(sb.toString());