Java中HashMap值遍历循环简化及Stream写法转换问题咨询
以下优化方案基于Java 8及以上版本,使用前需要导入java.util.stream.Collectors和java.util.stream.Stream两个类。
第一段setSHAShortSha方法优化
原代码核心问题是存在重复的遍历拼接逻辑,用Stream API可合并重复逻辑,同时优化字符串拼接效率:
public void setSHAShortSha() { String s = Stream.concat( blobHashMap.values().stream(), parentTracked == null ? Stream.empty() : parentTracked.values().stream() ) .map(Blob::toString) .collect(Collectors.joining()); sha = Utils.sha1(logMessage + dateFormatted + s); shortSha = MyUtils.getShortSha(sha); }
第二段Commit查找逻辑优化
原代码用了额外的found标记变量,用Stream可以直接消除标记变量,简化逻辑:
boolean found = commits.values().stream() .filter(commit -> commit.getLogMessage().compareTo(commitMessageToSearch) == 0) .peek(commit -> System.out.println(commit.getSha())) .findAny() .isPresent(); if (!found) { System.out.println("aksdhlkasj"); }
如果是Java 9及以上版本,用ifPresentOrElse可以完全省略found变量,写法更短:
commits.values().stream() .filter(commit -> commit.getLogMessage().compareTo(commitMessageToSearch) == 0) .peek(commit -> System.out.println(commit.getSha())) .findAny() .ifPresentOrElse( present -> {}, () -> System.out.println("aksdhlkasj") );
核心Stream方法说明
map(对象::方法名):方法引用,等价于遍历每个元素调用对应方法,返回处理后的新流Collectors.joining():把流里的所有字符串拼接成一个完整字符串,底层基于StringBuilder实现,比循环里用+=拼接字符串效率高Stream.concat(流1, 流2):将两个流拼接为一个流,适合多集合遍历的场景filter(条件):按指定条件过滤流中的元素,只保留符合条件的元素peek(操作):遍历流元素时执行指定的消费操作,不会改变流本身的元素内容findAny():匹配到第一个符合条件的元素就终止流操作,不需要遍历整个集合,性能更好
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

