java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java  function 与 apply用法

Java 中 Function 与 apply 的实际应用场景分析(含优化前后案例)

作者:岁冉

本文介绍了如何使用Java 8的Function函数式接口简化重复逻辑,包括判空、格式化、字段提取等常见场景,通过实际案例,展示了如何将多个字段的处理逻辑集中到一个函数中,从而提高代码的可读性和可维护性,感兴趣的朋友跟随小编一起看看吧

在日常开发中,我们会遇到一些代码重复度高、逻辑结构雷同的场景,比如:

以前这些逻辑通常依赖大量 if-else,导致代码冗长、可读性差。随着 Java 8 Lambda 的流行,我们可以借助 Function 函数式接口 让代码更简洁、更易维护。

本文通过一个实际场景,讲解:

🧩 一、Function 是什么?

Java 8 提供了大量函数式接口(位于 java.util.function 包里),其中 Function<T, R> 是最常用的一个:

简单理解:

Function 表示一个“输入一个参数(T),输出一个结果(R)”的函数。

例如:

🧲 二、apply 做什么?

apply() 是 Function 的核心方法,用来执行函数逻辑,你可以把 apply() 理解成“执行这个函数”。比如如下方法,我们需要获取每个字符串的字符串长度:

Function<String, Integer> lengthFunc = str -> str.length();
int len = lengthFunc.apply("hello");  // 返回 5

📘 三、业务场景:字段多、判空多、逻辑重复

💡1、传统做法

假设我们有一个实体(例如某企业的年度指标数据):

class IndicatorEntity {
    private String amountA;
    private String amountB;
    private String amountC;
    // ...getter/setter
}

我们需要根据它生成一个 VO 列表,输出时存在各种问题,比如

传统写法会有大量的 if-else 判断,大量重复(下述代码中 format() 表示规范字段的值,如实现判空、保留两位小数等逻辑):

List<ItemVO> list = new ArrayList<>();
if (StringUtils.isNotBlank(entity.getAmountA())) {
    list.add(new ItemVO("指标A", format(entity.getAmountA()), "吨"));
} else {
    list.add(new ItemVO("指标A", "0", "吨"));
}
if (StringUtils.isNotBlank(entity.getAmountB())) {
    list.add(new ItemVO("指标B", format(entity.getAmountB()), "吨"));
} else {
    list.add(new ItemVO("指标B", "0", "吨"));
}
// ...重复更多

💡2、使用 Function 优化:统一 null 处理与格式化

我们使用一个 Function<String, String>,用于将字段安全地转换成非空:

Function<String, String> safeFormat = val -> val == null ? "" : val;

之后构造字段数组如下:

Object[][] fields = {
    {"指标A", safeFormat.apply(entity.getAmountA()), "吨"},
    {"指标B", safeFormat.apply(entity.getAmountB()), "吨"},
    {"指标C", safeFormat.apply(entity.getAmountC()), "吨"},
    // 其他指标依次添加
};

之后对其统一格式化处理:

List<ItemVO> result = new ArrayList<>();
for (Object[] field : fields) {
    String name = (String) field[0];
    String rawValue = (String) field[1];
    String unit = (String) field[2];
    String formattedValue = "0";
    if (StringUtils.isNotBlank(rawValue)) {
        try {
            // 统一格式化,例如 NumberUtil.formatStr(),或其他你需要对字符串进行的操作
            formattedValue = format(rawValue);   
        } catch (Exception ignored) {
            // 你需要进行的异常操作
        }
    }
    result.add(new ItemVO(name, formattedValue, unit));
}

经过优化后:

🎯 四、Function 的实际适用场景总结

① null 安全处理(最常见)

② 字段提取器(Getter 复用)——比如多字段统一处理,适用于:动态抽取实体字段值、在工具类中避免大量重复 getter 调用:

<T, R> R getValue(T entity, Function<T, R> getter) {
    return getter.apply(entity);
}
String value = getValue(entity, IndicatorEntity::getAmountA);

③ 通用格式化处理——例如统一格式化数字、日期:

Function<String, String> formatAmount = s -> {
    if (StringUtils.isBlank(s)) return "0";
    return NumberUtil.formatStr(s, 2);
};

④ 配置化字段处理

如本文案例,将字段名称、原始值、单位放在数组或列表中,之后统一判空、格式化、填充默认值、构造VO。

🧨 五、进一步延申:组合函数 compose 与 andThen

compose:先执行参数里的 Function,再执行当前 Function

Function<String, Integer> length = s -> s.length();
Function<String, String> trim = s -> s.trim();
int len = length.compose(trim).apply("  hi  "); // 2

andThen:先执行当前 Function,再执行参数里的 Function

int len = trim.andThen(length).apply("  hi  "); // 2

适用于多步骤处理,例如:

到此这篇关于Java 中 Function 与 apply 的实际应用场景分析(含优化前后案例)的文章就介绍到这了,更多相关java function 与 apply用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文