Java 8 Lambda代码重构求助:基于函数式编程改造现有代码
用Java 8 Lambda/Stream重构你的代码
嘿,很高兴看到你在啃函数式编程的基础!咱们来把这段代码重构得更符合Java 8的风格,同时完全保留原有逻辑~
先梳理下原代码的核心逻辑:
- 从
application中获取xx_xx_xx属性并转为String - 校验该字符串非空且长度大于0
- 按逗号分割成数组,遍历数组查找是否存在与
session中xyz_xyz_xyz属性相等的元素 - 找到匹配项后执行
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




