From 2cdfed79f63735940ddd2f93eb2dfb619c2cee93 Mon Sep 17 00:00:00 2001 From: many2many <6168830@qq.com> Date: Sat, 19 Oct 2024 09:21:12 +0800 Subject: [PATCH] ref --- docs/chapter05.md | 157 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 132 insertions(+), 25 deletions(-) diff --git a/docs/chapter05.md b/docs/chapter05.md index 9a05df0..c672e8e 100644 --- a/docs/chapter05.md +++ b/docs/chapter05.md @@ -73,44 +73,151 @@ public @interface 注解名称{ 注解和类、接口、枚举是同一级别的。注解的本质@interface和interface从名字上看非常相似。 - **注解三角** - -要牢记,只要用到注解,必然有三角关系: -- 定义注解 -- 使用注解 -- 读取注解 + - 定义注解 + - 使用注解 + - 读取注解 **小结** - 注解就像标签,是程序判断执行的依据。比如,程序读到@Test就知道这个方法是待测试方法,而@Before的方法要在测试方法之前执行 - 注解需要三要素:定义、使用、读取并执行 -- 注解分为自定义注解、JDK内置注解和第三方注解(框架)。自定义注解一般要我们自己定义、使用、并写程序读取,而JDK内置注解和第三方注解我们只要使用,定义和读取都交给它们 -- 大多数情况下,三角关系中我们只负责使用注解,无需定义和执行,框架会将注解类和读取注解的程序隐藏起来,除非阅读源码,否则根本看不到。平时见不到定义和读取的过程,光顾着使用注解,久而久之很多人就忘了注解如何起作用了! +- 注解分为自定义注解、JDK 内置注解和第三方框架注解。自定义注解需要开发者自己定义、使用和读取,而 JDK 内置注解和第三方注解通常只需要使用,定义和读取由框架或工具完成 #### 5.1.3 Optional的介绍和使用(了解) -- **定义**: `Optional`是Java 8引入的一个容器类,用于避免null值。 -- **用途**: - - **封装可能为null的对象**: 避免空指针异常。 - - **提供链式操作**: 支持方法链式调用。 -- **示例**: - ```java - Optional optional = Optional.ofNullable("Hello, World!"); - optional.ifPresent(System.out::println); - ``` +### 5.1.3 `Optional` 的介绍和使用(了解) -#### 5.1.4 Stream API的介绍和使用(了解) -- **定义**: Stream API是Java 8引入的新特性,用于处理集合数据。 -- **用途**: - - **数据流处理**: 提供了一种声明式的处理集合数据的方式。 - - **并行处理**: 支持并行流处理。 -- **示例**: +#### 定义 +`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 other)`**: 如果 `Optional` 包含值,则返回该值;否则返回由 `Supplier` 提供的值。 +- **`Optional.orElseThrow(Supplier exceptionSupplier)`**: 如果 `Optional` 包含值,则返回该值;否则抛出由 `exceptionSupplier` 生成的异常。 +- **`Optional.ifPresent(Consumer action)`**: 如果 `Optional` 包含值,则执行 `action`;否则不执行任何操作。 + +#### 示例 ```java - List 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 +import java.util.Optional; + +public class OptionalExample { + public static void main(String[] args) { + // 使用Optional.ofNullable封装可能为null的值 + Optional 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; // 或者返回一个实际的值 + } +} ``` +#### 小结 +- **避免空指针异常**: 使用 `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 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 of even numbers: " + sum); // 输出 6 + + // 打印偶数 + System.out.println("Even numbers:"); + numbers.stream() + .filter(n -> n % 2 == 0) + .forEach(System.out::println); // 输出 2 和 4 + + // 获取偶数的平方列表 + List 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 泛型(了解)