This commit is contained in:
many2many 2024-10-19 09:21:12 +08:00
parent ac13a31489
commit 2cdfed79f6

View File

@ -73,8 +73,6 @@ public @interface 注解名称{
注解和类、接口、枚举是同一级别的。注解的本质@interface和interface从名字上看非常相似。
- **注解三角**
要牢记,只要用到注解,必然有三角关系:
- 定义注解
- 使用注解
- 读取注解
@ -84,33 +82,142 @@ public @interface 注解名称{
- 注解就像标签,是程序判断执行的依据。比如,程序读到@Test就知道这个方法是待测试方法而@Before的方法要在测试方法之前执行
- 注解需要三要素:定义、使用、读取并执行
- 注解分为自定义注解、JDK内置注解和第三方注解框架。自定义注解一般要我们自己定义、使用、并写程序读取而JDK内置注解和第三方注解我们只要使用定义和读取都交给它们
- 大多数情况下,三角关系中我们只负责使用注解,无需定义和执行,框架会将注解类和读取注解的程序隐藏起来,除非阅读源码,否则根本看不到。平时见不到定义和读取的过程,光顾着使用注解,久而久之很多人就忘了注解如何起作用了!
- 注解分为自定义注解、JDK 内置注解和第三方框架注解。自定义注解需要开发者自己定义、使用和读取,而 JDK 内置注解和第三方注解通常只需要使用,定义和读取由框架或工具完成
#### 5.1.3 Optional的介绍和使用(了解)
- **定义**: `Optional`是Java 8引入的一个容器类用于避免null值。
- **用途**:
- **封装可能为null的对象**: 避免空指针异常。
- **提供链式操作**: 支持方法链式调用。
- **示例**:
### 5.1.3 `Optional` 的介绍和使用(了解)
#### 定义
`Optional` 是 Java 8 引入的一个容器类,用于封装可能为 `null` 的值。它的主要目的是帮助开发者避免空指针异常,并提供一种更优雅的方式来处理可能不存在的值。
#### 用途
- **封装可能为 `null` 的对象**: `Optional` 提供了一种安全的方式来处理可能为 `null` 的对象,从而避免了空指针异常。
- **提供链式操作**: `Optional` 支持方法链式调用,使得代码更加简洁和可读。
#### 主要方法
- **`Optional.of(T value)`**: 如果 `value` 不为 `null`,则创建一个包含该值的 `Optional` 对象;如果 `value``null`,则抛出 `NullPointerException`
- **`Optional.ofNullable(T value)`**: 如果 `value` 不为 `null`,则创建一个包含该值的 `Optional` 对象;如果 `value``null`,则返回一个空的 `Optional` 对象。
- **`Optional.empty()`**: 返回一个空的 `Optional` 对象。
- **`Optional.isPresent()`**: 判断 `Optional` 是否包含值。
- **`Optional.orElse(T other)`**: 如果 `Optional` 包含值,则返回该值;否则返回 `other`
- **`Optional.orElseGet(Supplier<? extends T> other)`**: 如果 `Optional` 包含值,则返回该值;否则返回由 `Supplier` 提供的值。
- **`Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)`**: 如果 `Optional` 包含值,则返回该值;否则抛出由 `exceptionSupplier` 生成的异常。
- **`Optional.ifPresent(Consumer<? super T> action)`**: 如果 `Optional` 包含值,则执行 `action`;否则不执行任何操作。
#### 示例
```java
Optional<String> optional = Optional.ofNullable("Hello, World!");
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
// 使用Optional.ofNullable封装可能为null的值
Optional<String> optional = Optional.ofNullable(getName());
// 使用ifPresent方法处理Optional中的值
optional.ifPresent(System.out::println);
// 使用orElse处理Optional为空的情况
String name = optional.orElse("Default Name");
System.out.println("Name: " + name);
// 使用orElseGet处理Optional为空的情况
name = optional.orElseGet(() -> "Computed Default Name");
System.out.println("Computed Name: " + name);
// 使用orElseThrow处理Optional为空的情况
try {
name = optional.orElseThrow(() -> new IllegalArgumentException("Name is missing"));
System.out.println("Name: " + name);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
private static String getName() {
return null; // 或者返回一个实际的值
}
}
```
#### 5.1.4 Stream API的介绍和使用(了解)
- **定义**: Stream API是Java 8引入的新特性用于处理集合数据。
- **用途**:
- **数据流处理**: 提供了一种声明式的处理集合数据的方式。
- **并行处理**: 支持并行流处理。
- **示例**:
#### 小结
- **避免空指针异常**: 使用 `Optional` 可以有效地避免空指针异常,并提供一种更优雅的方式来处理可能为 `null` 的值。
- **链式操作**: `Optional` 支持方法链式调用,使得处理逻辑更加简洁明了。
- **提供多种处理方式**: `Optional` 提供了多种方法来处理可能为空的情况,如 `ifPresent`、`orElse`、`orElseGet` 和 `orElseThrow` 等。
通过使用 `Optional`,开发者可以写出更加健壮和易于维护的代码。
### 5.1.4 Stream API 的介绍和使用(了解)
#### 定义
Stream API 是 Java 8 引入的新特性,用于处理集合数据。它提供了一种声明式的、函数式风格的数据处理方式,使得处理集合数据变得更加简洁和高效。
#### 用途
- **数据流处理**: Stream API 提供了一种声明式的处理集合数据的方式,使得开发者可以更专注于描述“做什么”而不是“怎么做”。
- **并行处理**: Stream API 支持并行流处理,可以自动利用多核处理器的优势,提高数据处理的性能。
#### 主要概念
- **源Source**: 数据的来源,通常是集合(如 `List`, `Set`)、数组或 `InputStream` 等。
- **中间操作Intermediate Operations**: 这些操作返回一个新的流,可以链接在一起形成流水线。常见的中间操作包括 `filter`, `map`, `flatMap`, `sorted`, `peek` 等。
- **终止操作Terminal Operations**: 这些操作产生结果或副作用,如计算总和、平均值、查找最大值或最小值等。常见的终止操作包括 `forEach`, `reduce`, `collect`, `count`, `max`, `min`, `anyMatch`, `allMatch`, `noneMatch`, `findFirst`, `findAny` 等。
#### 示例
以下是一个使用 Stream API 处理集合数据的示例:
```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
// 创建一个整数列表
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().filter(n -> n % 2 == 0).mapToInt(Integer::intValue).sum();
System.out.println(sum); // 输出 6
// 计算偶数之和
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println("Sum of even numbers: " + sum); // 输出 6
// 打印偶数
System.out.println("Even numbers:");
numbers.stream()
.filter(n -> n % 2 == 0)
.forEach(System.out::println); // 输出 2 和 4
// 获取偶数的平方列表
List<Integer> squaresOfEvens = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println("Squares of even numbers: " + squaresOfEvens); // 输出 [4, 16]
// 计算偶数的最大值
Integer maxEven = numbers.stream()
.filter(n -> n % 2 == 0)
.max(Integer::compare)
.orElse(null);
System.out.println("Maximum even number: " + maxEven); // 输出 4
// 并行处理
long parallelSum = numbers.parallelStream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println("Parallel sum of even numbers: " + parallelSum); // 输出 6
}
}
```
#### 小结
- **声明式编程**: Stream API 采用声明式的编程风格,使得代码更加简洁易懂。
- **函数式风格**: Stream API 支持函数式编程特性,可以方便地组合多个操作。
- **并行处理**: Stream API 支持并行处理,可以充分利用多核处理器的优势来加速数据处理。
- **链式操作**: Stream API 支持链式调用,使得多个操作可以串联起来形成数据处理流水线。
通过使用 Stream API开发者可以写出更加高效、简洁且易于维护的代码。这对于处理大量数据集尤其有用同时也提高了代码的可读性和可维护性。
#### 5.1.5 泛型(了解)