本文目录导读:

- 传统if-else检查
- 使用Optional类(Java 8+)
- Java 16+ 模式匹配中的null处理
- 使用Objects工具类
- 使用Apache Commons或Guava
- 自定义空安全函数
- Java 8+ 最佳实践模式
- 建议
在Java中处理空值模式匹配主要有以下几种方式:
传统if-else检查
public void processString(String str) {
if (str != null && str.length() > 0) {
System.out.println("字符串长度: " + str.length());
} else {
System.out.println("字符串为null或空");
}
}
使用Optional类(Java 8+)
public void processWithOptional(String str) {
Optional.ofNullable(str)
.filter(s -> s.length() > 0)
.ifPresentOrElse(
s -> System.out.println("长度: " + s.length()),
() -> System.out.println("null或空字符串")
);
}
// 链式操作
public String transform(Department dept) {
return Optional.ofNullable(dept)
.map(Department::getManager)
.map(Employee::getName)
.orElse("未知");
}
Java 16+ 模式匹配中的null处理
Record模式匹配
record Person(String name, int age) {}
public void processPerson(Object obj) {
if (obj instanceof Person(String name, int age) && name != null) {
System.out.println(name + " 年龄: " + age);
} else if (obj == null) {
System.out.println("对象为null");
}
}
switch模式匹配(Java 17+ 预览)
public String getType(Object obj) {
return switch (obj) {
case null -> "null值";
case Integer i && i > 0 -> "正整数: " + i;
case String s && s.length() > 0 -> "非空字符串: " + s;
case String s -> "空字符串";
default -> "其他类型: " + obj;
};
}
使用Objects工具类
import java.util.Objects;
public void safeEquals(String a, String b) {
if (Objects.equals(a, b)) {
System.out.println("相等(包括都为空的情况)");
}
// 安全比较
int result = Objects.compare(a, b, String::compareTo);
// 检查null
String safe = Objects.requireNonNullElse(a, "默认值");
// 带自定义消息
Objects.requireNonNull(a, "参数不能为null");
}
使用Apache Commons或Guava
Apache Commons Lang3
import org.apache.commons.lang3.ObjectUtils;
public void commonsExamples(String str) {
if (ObjectUtils.isNotEmpty(str)) {
System.out.println(str.length());
}
String safe = ObjectUtils.defaultIfNull(str, "默认值");
// 使用第一个非null值
String result = ObjectUtils.firstNonNull(str, "备选1", "备选2");
}
Guava
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
public void guavaExamples(String str) {
Preconditions.checkNotNull(str, "str不能为null");
if (!Strings.isNullOrEmpty(str)) {
System.out.println(str.length());
}
String safe = Strings.nullToEmpty(str); // null转为 ""
}
自定义空安全函数
@FunctionalInterface
interface SafeFunction<T, R> {
R apply(T t);
default R applyOrElse(T t, R defaultValue) {
try {
return t != null ? apply(t) : defaultValue;
} catch (Exception e) {
return defaultValue;
}
}
}
// 使用
SafeFunction<String, Integer> lengthFunc = String::length;
Integer length = lengthFunc.applyOrElse(someString, 0);
Java 8+ 最佳实践模式
public class NullSafePattern {
// 使用Optional链式处理
public static <T, R> R extractProperty(T object,
Function<T, R> extractor,
R defaultValue) {
return Optional.ofNullable(object)
.map(extractor)
.orElse(defaultValue);
}
// 多层嵌套对象安全访问
public static String getManagerDisplayName(Employee emp) {
return Optional.ofNullable(emp)
.map(Employee::getDepartment)
.map(Department::getManager)
.map(Manager::getDisplayName)
.orElse("未知");
}
}
// 使用示例
class Example {
public void demo(Employee emp) {
// 传统做法
if (emp != null && emp.getDepartment() != null
&& emp.getDepartment().getManager() != null) {
Manager mgr = emp.getDepartment().getManager();
System.out.println(mgr.getDisplayName());
}
// 空安全模式
NullSafePattern.getManagerDisplayName(emp);
}
}
建议
- Java 8+:优先使用
Optional,但不要过度使用(如作为字段类型) - Java 16+:利用新的模式匹配特性
- 性能敏感场景:使用传统if-else检查,避免Optional装箱开销
- API设计:明确文档说明null值的含义和处理方式
- 编码规范:团队统一空值处理策略,避免混用不同方式
选择哪种方式取决于Java版本、项目规范和具体场景需求。