You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java 8 Lambda代码重构求助:基于函数式编程改造现有代码

用Java 8 Lambda/Stream重构你的代码

嘿,很高兴看到你在啃函数式编程的基础!咱们来把这段代码重构得更符合Java 8的风格,同时完全保留原有逻辑~

先梳理下原代码的核心逻辑:

  1. application中获取xx_xx_xx属性并转为String
  2. 校验该字符串非空且长度大于0
  3. 按逗号分割成数组,遍历数组查找是否存在与sessionxyz_xyz_xyz属性相等的元素
  4. 找到匹配项后执行return逻辑

重构后的代码(两种风格供你参考)

风格1:保留部分显式检查,结合Stream

这种方式更贴近原有代码结构,新手更容易理解:

// 先把session中的目标值取出来,避免重复转换
String targetBranch = (String) session.getAttribute("xyz_xyz_xyz");
String reinBranches = (String) application.getAttribute("xx_xx_xx");

if (reinBranches != null && !reinBranches.isEmpty()) {
    // 用Stream的anyMatch做短路查找,找到匹配项就停止遍历
    boolean hasMatchingBranch = Arrays.stream(reinBranches.split(","))
                                      .anyMatch(branch -> branch.equals(targetBranch));
    if (hasMatchingBranch) {
        // 这里放入你原来return的内容,比如return true; 或者业务逻辑代码
    }
}

风格2:用Optional简化空检查,更函数式

如果想进一步消除繁琐的null判断,可以用Optional来优化:

String targetBranch = (String) session.getAttribute("xyz_xyz_xyz");

// 先处理targetBranch可能为null的情况
if (targetBranch != null) {
    boolean hasMatchingBranch = Optional.ofNullable((String) application.getAttribute("xx_xx_xx"))
                                        .filter(s -> !s.isEmpty()) // 过滤空字符串
                                        .map(s -> s.split(","))   // 分割成数组
                                        .flatMap(Arrays::stream)  // 把数组转成Stream
                                        .anyMatch(targetBranch::equals); // 用方法引用简化Lambda
    if (hasMatchingBranch) {
        // 执行你的return逻辑
    }
}

关键知识点解释:

  • Arrays.stream():把数组转换成Stream,让我们能用函数式的方式遍历元素
  • anyMatch():短路操作——只要找到第一个匹配的元素就会停止遍历,性能和原代码的for循环完全一致
  • 方法引用targetBranch::equals:等价于Lambda表达式branch -> branch.equals(targetBranch),写法更简洁直观
  • Optional:用来优雅处理null值,避免满屏的if (xxx != null)判断

内容的提问来源于stack exchange,提问作者Abid Ali

火山引擎 最新活动