Java8新特性
Java8 核心高频新特性(Lambda / Stream / Optional / 新时间API)
精选面试与开发最常用4个特性,附带原理说明与可运行Demo代码
目录
1. Lambda表达式
说明:简化只有一个抽象方法接口的匿名内部类写法,可以将代码块作为参数传递。
语法:(参数列表) -> {方法体}
public class LambdaDemo {
public static void main(String[] args) {
// 传统匿名内部类写法
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("传统匿名内部类");
}
};
// Lambda简写
Runnable r2 = () -> System.out.println("Lambda表达式写法");
r2.run();
}
}
代码解释:接口仅有单个抽象方法时,就可以使用 Lambda;JVM 自动推导参数类型,简化样板代码。
2. Stream API 流式处理
说明:Java8引入的集合声明式链式编程API,核心特点惰性求值。
- 中间操作:
filter、map、sorted、distinct,仅定义处理规则,不会立即执行,返回新Stream。 - 终止操作:
collect、forEach、count、anyMatch,触发流执行,流执行完成后不可复用。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamDemo {
public static void main(String[] args) {
List<String> source = Arrays.asList("java", null, "spring", "vue", "jvm");
List<String> result = source.stream()
.filter(item -> item != null) //过滤null元素
.filter(item -> item.length() > 3) //过滤长度大于3的字符串
.map(String::toUpperCase) //全部转为大写
.collect(Collectors.toList()); //收集结果为List
System.out.println(result);
}
}
代码解释:链式调用只是组装处理规则,只有调用终止操作collect()才会真正遍历执行;不会修改原集合;parallelStream()可开启并行流,需要注意线程安全。
3. Optional 空指针容器
说明:Java8新增,用于包装对象,强制开发者主动处理空场景;不能彻底消灭NPE(Optional引用本身可以为null)。
编码规范:推荐作为方法返回值;不建议作为成员变量、方法入参。
import java.util.Optional;
public class OptionalDemo {
static class User {
private String name;
public User(String name) { this.name = name; }
public String getName() { return name; }
}
public static void main(String[] args) {
User user = null;
Optional<User> optUser = Optional.ofNullable(user);
String userName = optUser.map(User::getName)
.orElse("默认用户名");
System.out.println(userName);
}
}
常用方法:
ofN-ofNullable ()`:最常用,支持传入 null
orElse():无论对象是否为空,内部代码都会执行orElseGet():仅当为空时才执行,推荐优先使用ifPresent():对象非空才执行回调逻辑
4. 全新时间API java.time包
说明:Java8新增时间API。旧Date、SimpleDateFormat可变,线程不安全;java.time包下所有类不可变、线程安全。
核心类:
LocalDate:只包含日期(年月日)LocalTime:只包含时间(时分秒)LocalDateTime:日期+时间DateTimeFormatter:线程安全的格式化工具
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class TimeDemo {
public static void main(String[] args) {
// 获取当前日期
LocalDate today = LocalDate.now();
System.out.println("当前日期:" + today);
// 获取当前日期时间
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String timeStr = now.format(formatter);
System.out.println("格式化时间:" + timeStr);
}
}

浙公网安备 33010602011771号