模式切换
Java 8 版本特性
Java 8 的新特性主要围绕函数式编程、集合数据处理、日期与时间 API 的改进展开,使开发者可以更高效、更优雅地完成日常任务。推荐深入学习这些特性,以更好地利用 Java 8 提升项目开发效率。
Lambda 表达式
Lambda 表达式为 Java 引入了函数式编程的能力,简化了代码编写。
语法
java
(parameters) -> expression
(parameters) -> { statements; }
示例
java
// 传统匿名类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("传统方式");
}
}).start();
// 使用 Lambda 表达式
new Thread(() -> System.out.println("Lambda 表达式")).start();
函数式接口
- 函数式接口是只有一个抽象方法的接口,可用于 Lambda 表达式。
- 通过注解
@FunctionalInterface
明确指定。
常用内置函数式接口
接口 | 抽象方法 | 用途 |
---|---|---|
Predicate<T> | boolean test(T t) | 条件判断 |
Function<T, R> | R apply(T t) | 输入转换为输出 |
Consumer<T> | void accept(T t) | 对输入执行操作 |
Supplier<T> | T get() | 提供结果,无输入参数 |
BiFunction<T, U, R> | R apply(T t, U u) | 两个输入,返回一个结果 |
示例
java
Predicate<Integer> isPositive = x -> x > 0;
System.out.println(isPositive.test(5)); // 输出 true
方法引用
方法引用是 Lambda 表达式的简化形式,用于直接引用现有方法。
类型
- 静态方法引用:
ClassName::methodName
- 实例方法引用:
instance::methodName
- 特定类型实例方法引用:
ClassName::methodName
- 构造器引用:
ClassName::new
示例
java
// 静态方法引用
Function<String, Integer> parseInt = Integer::parseInt;
System.out.println(parseInt.apply("123")); // 输出 123
// 构造器引用
Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();
Stream API
Stream API 提供了一种函数式风格的数据处理方式,用于处理集合或数组。
核心方法
方法 | 描述 |
---|---|
filter | 过滤元素 |
map | 转换元素 |
collect | 收集处理结果 |
forEach | 遍历流中的元素 |
reduce | 归约操作,合并元素 |
sorted | 对流中的元素排序 |
示例
java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(filteredNames); // 输出 [ALICE]
Optional 类
Optional
是一个容器类,用于避免 null
带来的空指针异常。
常用方法
ofNullable(T value)
:可以接受null
。isPresent()
:检查是否有值。orElse(T other)
:当值为空时返回默认值。ifPresent(Consumer<? super T> action)
:对值执行操作。
示例
java
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.orElse("默认值")); // 输出 "默认值"
默认方法与静态方法
- 接口可以有默认实现方法(
default
修饰)。 - 接口可以有静态方法。
示例
java
interface Vehicle {
default void start() {
System.out.println("默认启动方法");
}
static void stop() {
System.out.println("静态方法停止");
}
}
class Car implements Vehicle {}
Car car = new Car();
car.start(); // 输出 "默认启动方法"
Vehicle.stop(); // 输出 "静态方法停止"
新的日期与时间 API
Java 8 引入了新的日期和时间 API,提供了更强大的功能和简洁的用法。
常用类
类 | 描述 |
---|---|
LocalDate | 表示日期 |
LocalTime | 表示时间 |
LocalDateTime | 表示日期和时间 |
ZonedDateTime | 表示带时区的日期和时间 |
示例
java
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(date); // 如:2024-12-13
System.out.println(time); // 如:14:30:00.123
System.out.println(dateTime); // 如:2024-12-13T14:30:00.123
其他改进
java.util.function
函数库:提供了大量的函数式接口。- 并行数组操作:
Arrays.parallelSort
。 - Base64 编码:
java.util.Base64
提供了简洁的 Base64 操作。
示例(Base64 编码)
java
String encoded = Base64.getEncoder().encodeToString("Hello".getBytes());
System.out.println(encoded); // 输出 "SGVsbG8="