面试实战 问题二十六 JDK 1.8 核心新特性详解
JDK 1.8 核心新特性详解
1. Lambda表达式
最核心的特性,简化函数式编程,语法:(参数) -> 表达式
// 传统方式
Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("传统方式");}
};// Lambda方式
Runnable r2 = () -> System.out.println("Lambda方式");
- 优势:减少模板代码,提高可读性
- 应用场景:集合遍历、线程创建、事件处理
2. 函数式接口
使用@FunctionalInterface
注解标记的单抽象方法接口,支持Lambda实现:
@FunctionalInterface
interface Converter<F, T> {T convert(F from);
}// 使用
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer result = converter.convert("123");
JDK内置四大核心函数接口:
Consumer<T>
:消费型(有入参无返回值)Supplier<T>
:供给型(无入参有返回值)Function<T,R>
:函数型(有入参和返回值)Predicate<T>
:断言型(返回boolean)
3. 方法引用
Lambda的语法糖,直接引用已有方法:
// 静态方法引用
Function<String, Integer> f1 = Integer::parseInt;// 实例方法引用
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println); // 等价于 x -> System.out.println(x)
4. Stream API
函数式数据处理管道,支持链式操作:
List<String> filtered = list.stream().filter(s -> s.startsWith("a")) // 过滤.map(String::toUpperCase) // 转换.sorted() // 排序.collect(Collectors.toList()); // 收集结果
- 核心操作:
- 中间操作:
filter()
,map()
,sorted()
,distinct()
- 终止操作:
collect()
,forEach()
,reduce()
,count()
- 中间操作:
- 并行处理:
parallelStream()
自动利用多核
5. 新的日期时间API
解决旧Date/Calendar
的线程安全问题:
LocalDate date = LocalDate.now(); // 日期 2023-07-21
LocalTime time = LocalTime.parse("10:15:30"); // 时间
LocalDateTime dt = date.atTime(time); // 组合// 时区处理
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));// 时间差计算
Duration duration = Duration.between(startTime, endTime);
包路径:java.time
6. 接口默认方法与静态方法
允许接口包含具体实现:
interface Vehicle {// 默认方法default void print() {System.out.println("我是一辆车!");}// 静态方法static void blowHorn() {System.out.println("按喇叭!!!");}
}
7. Optional类
解决空指针异常:
Optional<String> opt = Optional.ofNullable(getName());
opt.ifPresent(name -> System.out.println(name.length())); // 非空时执行String result = opt.orElse("default"); // 空值返回默认
8. 其他重要特性
- 重复注解:同一位置多次使用相同注解
- 类型注解:注解可应用于任何类型声明
- Nashorn引擎:基于JavaScript的运行时环境
- 并行数组操作:
Arrays.parallelSort()
面试回答建议
回答时建议按以下结构组织:
- 核心特性:Lambda + Stream + 新日期API(必答)
- 配套机制:函数式接口 + 方法引用
- 扩展特性:Optional + 接口默认方法
- 实际应用:结合项目经验举例(如Stream处理数据集合)
⚠️ 注意:避免死记硬背,重点理解每个特性的设计目的和使用场景
相关问题
- Lambda表达式与匿名内部类的本质区别是什么?
- 为什么Stream API能提升集合操作的性能?
- 新的日期时间API如何解决线程安全问题?
- 函数式接口中
@FunctionalInterface
注解的作用是什么? - Optional类在实际开发中有哪些使用陷阱?