142 lines
3.7 KiB
Markdown
142 lines
3.7 KiB
Markdown
Java 8 特性示例项目
|
||
---
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
|
||
src/main/java/
|
||
├── Main.java // 主程序入口
|
||
├── LambdaExample.java // Lambda表达式示例
|
||
├── StreamExample.java // Stream API示例
|
||
├── OptionalExample.java // Optional类示例
|
||
├── DateTimeExample.java // 新日期时间API示例
|
||
└── FunctionExample.java // 函数式接口示例
|
||
```
|
||
## Java 8 特性详解
|
||
|
||
### 1. Lambda 表达式 (LambdaExample.java)
|
||
|
||
Lambda表达式是Java 8最重要的新特性之一,它允许把函数作为一个方法的参数(函数作为参数传递)。
|
||
|
||
主要示例:
|
||
- Runnable接口的Lambda简化写法
|
||
- 集合排序的Lambda表达式用法
|
||
- 不同形式的Lambda表达式语法
|
||
|
||
```
|
||
java
|
||
// 传统匿名内部类
|
||
Runnable oldRunnable = new Runnable() {
|
||
@Override
|
||
public void run() {
|
||
System.out.println("传统方式执行Runnable");
|
||
}
|
||
};
|
||
|
||
// Lambda表达式
|
||
Runnable newRunnable = () -> System.out.println("Lambda方式执行Runnable");
|
||
```
|
||
### 2. Stream API (StreamExample.java)
|
||
|
||
Stream API是Java 8中处理集合的关键抽象概念,它可以对集合进行各种操作,如过滤、映射、排序等。
|
||
|
||
主要示例:
|
||
- filter() 过滤操作
|
||
- map() 映射操作
|
||
- collect() 收集操作
|
||
- findFirst() 查找操作
|
||
- parallelStream() 并行流处理
|
||
|
||
```
|
||
java
|
||
// 过滤年龄大于25的人
|
||
List<Person> filtered = people.stream()
|
||
.filter(person -> person.getAge() > 25)
|
||
.collect(Collectors.toList());
|
||
|
||
// 提取所有人的姓名
|
||
List<String> names = people.stream()
|
||
.map(Person::getName)
|
||
.collect(Collectors.toList());
|
||
```
|
||
### 3. Optional 类 (OptionalExample.java)
|
||
|
||
Optional类是一个可以为null的容器对象,用来避免空指针异常,更好地处理可能为null的值。
|
||
|
||
主要示例:
|
||
- of() 和 empty() 创建Optional对象
|
||
- isPresent() 判断是否有值
|
||
- orElse() 提供默认值
|
||
- ifPresent() 存在时执行操作
|
||
- map() 转换值
|
||
|
||
```
|
||
java
|
||
Optional<String> optional = Optional.of("Hello Java 8");
|
||
Optional<String> emptyOptional = Optional.empty();
|
||
|
||
// 使用orElse提供默认值
|
||
String value = emptyOptional.orElse("默认值");
|
||
|
||
// 使用ifPresent执行操作
|
||
optional.ifPresent(s -> System.out.println("处理值: " + s.toUpperCase()));
|
||
```
|
||
### 4. 新的日期时间API (DateTimeExample.java)
|
||
|
||
Java 8引入了新的日期时间API(java.time包),解决了之前Date和Calendar类的缺陷。
|
||
|
||
主要示例:
|
||
- LocalDate 只包含日期
|
||
- LocalDateTime 包含日期和时间
|
||
- DateTimeFormatter 日期格式化
|
||
- plusWeeks(), minusMonths() 日期计算
|
||
|
||
```
|
||
java
|
||
// LocalDate示例
|
||
LocalDate today = LocalDate.now();
|
||
LocalDate specificDate = LocalDate.of(2025, 7, 18);
|
||
|
||
// LocalDateTime示例
|
||
LocalDateTime now = LocalDateTime.now();
|
||
|
||
// 日期格式化
|
||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||
String formattedDate = now.format(formatter);
|
||
```
|
||
### 5. 函数式接口 (FunctionExample.java)
|
||
|
||
Java 8提供了许多内置的函数式接口,如Predicate、Consumer、Function、Supplier等。
|
||
|
||
主要示例:
|
||
- Predicate 用于判断操作
|
||
- Consumer 用于消费数据
|
||
- Function 用于数据转换
|
||
- Supplier 用于生成数据
|
||
|
||
```
|
||
java
|
||
// Predicate示例
|
||
Predicate<Integer> isEven = n -> n % 2 == 0;
|
||
|
||
// Consumer示例
|
||
Consumer<String> printer = System.out::println;
|
||
|
||
// Function示例
|
||
java.util.function.Function<String, Integer> stringToLength = String::length;
|
||
|
||
// Supplier示例
|
||
java.util.function.Supplier<Double> randomSupplier = Math::random;
|
||
```
|
||
|
||
## 学习建议
|
||
|
||
建议按以下顺序学习Java 8特性:
|
||
1. 先理解Lambda表达式的基本语法
|
||
2. 学习函数式接口的概念
|
||
3. 掌握Stream API的常用操作
|
||
4. 熟悉Optional类的使用场景
|
||
5. 了解新的日期时间API的优势
|
||
|