Java 8 新特性实战指南
目录
接口的默认方法与静态方法
设计初衷
- 解决接口修改与现有实现不兼容的问题
- 允许接口包含具体方法实现(默认方法)
- 支持静态方法定义
核心特性
public interface InterfaceNew {
static void sm() {
System.out.println("接口静态方法");
}
default void def() {
System.out.println("默认方法");
}
void f(); // 抽象方法
}
使用规范
- 默认方法:
- 静态方法:
冲突解决
public class InterfaceNewImpl implements InterfaceNew, InterfaceNew1 {
@Override
public void def() {
InterfaceNew1.super.def(); // 显式指定接口
}
}
接口 vs 抽象类
特性 |
接口 |
抽象类 |
继承方式 |
多实现 |
单继承 |
方法修饰符 |
public abstract |
任意访问修饰符 |
变量修饰符 |
public static final |
无限制 |
设计目的 |
行为扩展 |
代码复用 |
函数式接口与Lambda表达式
函数式接口定义
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
Lambda语法
// 传统方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("传统实现");
}
}).start();
// Lambda实现
new Thread(() -> System.out.println("Lambda表达式")).start();
方法引用
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println); // 静态方法引用
list.forEach(String::toUpperCase); // 实例方法引用
变量捕获
- 只能引用final或等效final的局部变量
- 禁止修改捕获变量
Stream API
核心特性
- 无存储:不存储数据
- 函数式编程:支持lambda表达式
- 延迟执行:终端操作触发执行
- 并行处理:parallelStream()
常用操作
List<String> strings = Arrays.asList("abc", "", "bc", "efg");
// 过滤空字符串
long count = strings.stream()
.filter(string -> !string.isEmpty())
.count();
// 映射转换
List<Integer> numbers = Arrays.asList(3, 2, 2, 3);
List<Integer> squares = numbers.stream()
.map(i -> i*i)
.distinct()
.collect(Collectors.toList());
// 并行处理
strings.parallelStream()
.filter(s -> s.startsWith("a"))
.forEach(System.out::println);
操作类型
操作类型 |
方法示例 |
中间操作 |
filter(), map(), sorted() |
终端操作 |
forEach(), collect(), count() |
Optional类
空值处理
public String getCity(User user) {
return Optional.ofNullable(user)
.flatMap(User::getAddress)
.map(Address::getCity)
.orElse("Unknown");
}
核心方法
方法 |
说明 |
ofNullable() |
创建可能为null的Optional |
map() |
值转换 |
orElse() |
默认值返回 |
ifPresent() |
值存在时执行操作 |
新的日期时间API
核心类
类名 |
说明 |
LocalDate |
日期(yyyy-MM-dd) |
LocalTime |
时间(HH:mm:ss) |
LocalDateTime |
日期+时间 |
ZonedDateTime |
带时区时间 |
使用示例
// 获取当前日期
LocalDate today = LocalDate.now();
// 日期计算
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
// 时区处理
ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
// 日期格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = LocalDateTime.now().format(formatter);
优势对比
- 线程安全:所有类都是不可变的
- 清晰设计:分离日期/时间概念
- 时区支持:内置完善的时区处理
- 链式操作:支持流畅的API调用
完整官方文档参考:Oracle Java 8 新特性