如何使用Java Streams或其他特性简化现有for循环遍历校验代码
改写方案
完全可以用Java Stream API改写,代码会更简洁,逻辑更直观。首先先明确原代码的逻辑:遍历所有提交记录,打印所有提交日志匹配的记录的SHA值,没有匹配项时打印指定字符串。
完全匹配原逻辑的改写(打印所有匹配项)
// Java 16+ 可用toList(),更低版本可以用collect(Collectors.toList()) List<Commit> matchedCommits = commits.values().stream() .filter(commit -> commit.getLogMessage().equals(commitMessageToSearch)) .toList(); matchedCommits.forEach(commit -> System.out.println(commit.getSha())); if (matchedCommits.isEmpty()) { System.out.println("aksdhlkasj"); }
优化版改写(找到第一个匹配项就终止遍历,性能更高)
如果你的需求不需要打印所有匹配项,只要找到任意一个匹配的就打印,可以用下面的写法,不用遍历整个集合:
// Java 9+ 支持ifPresentOrElse commits.values().stream() .filter(commit -> commit.getLogMessage().equals(commitMessageToSearch)) .findAny() .ifPresentOrElse( commit -> System.out.println(commit.getSha()), () -> System.out.println("aksdhlkasj") );
如果是Java 8版本,改写成如下形式即可:
Optional<Commit> matchedCommit = commits.values().stream() .filter(commit -> commit.getLogMessage().equals(commitMessageToSearch)) .findAny(); if (matchedCommit.isPresent()) { System.out.println(matchedCommit.get().getSha()); } else { System.out.println("aksdhlkasj"); }
补充说明
原代码中使用compareTo() == 0对比字符串,和equals()方法效果一致,除非你有特殊的排序对比需求,否则用equals()可读性更高。
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

