本文目录导读:

- 传统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版本、项目规范和具体场景需求。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播