Java空值模式匹配怎么处理

wen java案例 9

本文目录导读:

Java空值模式匹配怎么处理

  1. 传统if-else检查
  2. 使用Optional类(Java 8+)
  3. Java 16+ 模式匹配中的null处理
  4. 使用Objects工具类
  5. 使用Apache Commons或Guava
  6. 自定义空安全函数
  7. Java 8+ 最佳实践模式
  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);
    }
}

建议

  1. Java 8+:优先使用 Optional,但不要过度使用(如作为字段类型)
  2. Java 16+:利用新的模式匹配特性
  3. 性能敏感场景:使用传统if-else检查,避免Optional装箱开销
  4. API设计:明确文档说明null值的含义和处理方式
  5. 编码规范:团队统一空值处理策略,避免混用不同方式

选择哪种方式取决于Java版本、项目规范和具体场景需求。

抱歉,评论功能暂时关闭!