mirror of
https://gitee.com/many2many/java-web.git
synced 2025-01-11 22:50:54 +08:00
ref
This commit is contained in:
parent
ac13a31489
commit
2cdfed79f6
@ -73,8 +73,6 @@ public @interface 注解名称{
|
|||||||
注解和类、接口、枚举是同一级别的。注解的本质@interface和interface从名字上看非常相似。
|
注解和类、接口、枚举是同一级别的。注解的本质@interface和interface从名字上看非常相似。
|
||||||
|
|
||||||
- **注解三角**
|
- **注解三角**
|
||||||
|
|
||||||
要牢记,只要用到注解,必然有三角关系:
|
|
||||||
- 定义注解
|
- 定义注解
|
||||||
- 使用注解
|
- 使用注解
|
||||||
- 读取注解
|
- 读取注解
|
||||||
@ -84,33 +82,142 @@ public @interface 注解名称{
|
|||||||
|
|
||||||
- 注解就像标签,是程序判断执行的依据。比如,程序读到@Test就知道这个方法是待测试方法,而@Before的方法要在测试方法之前执行
|
- 注解就像标签,是程序判断执行的依据。比如,程序读到@Test就知道这个方法是待测试方法,而@Before的方法要在测试方法之前执行
|
||||||
- 注解需要三要素:定义、使用、读取并执行
|
- 注解需要三要素:定义、使用、读取并执行
|
||||||
- 注解分为自定义注解、JDK内置注解和第三方注解(框架)。自定义注解一般要我们自己定义、使用、并写程序读取,而JDK内置注解和第三方注解我们只要使用,定义和读取都交给它们
|
- 注解分为自定义注解、JDK 内置注解和第三方框架注解。自定义注解需要开发者自己定义、使用和读取,而 JDK 内置注解和第三方注解通常只需要使用,定义和读取由框架或工具完成
|
||||||
- 大多数情况下,三角关系中我们只负责使用注解,无需定义和执行,框架会将注解类和读取注解的程序隐藏起来,除非阅读源码,否则根本看不到。平时见不到定义和读取的过程,光顾着使用注解,久而久之很多人就忘了注解如何起作用了!
|
|
||||||
|
|
||||||
#### 5.1.3 Optional的介绍和使用(了解)
|
#### 5.1.3 Optional的介绍和使用(了解)
|
||||||
- **定义**: `Optional`是Java 8引入的一个容器类,用于避免null值。
|
### 5.1.3 `Optional` 的介绍和使用(了解)
|
||||||
- **用途**:
|
|
||||||
- **封装可能为null的对象**: 避免空指针异常。
|
#### 定义
|
||||||
- **提供链式操作**: 支持方法链式调用。
|
`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
|
```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);
|
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
|
```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);
|
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 泛型(了解)
|
#### 5.1.5 泛型(了解)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user