Java 8中如何使用Stream统计数组中长度不超过指定值的字符串数量
关于Java 8 Stream统计符合长度要求字符串的问题
嘿,你的实现完全正确!而且完全不用担心会进行两次遍历——Java Stream的流水线操作是惰性求值+单次遍历的模式,具体来说:
- 当你调用
Arrays.stream(myArray)只是创建了一个流对象,并没有开始遍历数组 filter(s -> s.length() <= maxLength)是一个中间操作,同样不会立即执行,只是在流的操作链里添加了一个过滤规则- 只有当你调用
count()这个终端操作时,整个流的流水线才会启动:数组里的每个元素会被依次取出,经过filter判断,如果符合条件就计入计数,整个过程只遍历数组一次,不会先把符合条件的元素都收集起来再去计数。
你可以把这个过程想象成:你拿着一个计数器,逐个检查数组里的字符串,每遇到长度≤maxLength的就把计数器加1,全程只走一遍数组,和你手动写循环的效率是一致的。
如果想直观验证的话,还可以在filter的lambda里加个打印语句:
int solution = Arrays.stream(myArray) .filter(s -> { System.out.println("正在检查字符串: " + s); return s.length() <= maxLength; }) .count();
运行后会看到每个字符串只会被打印一次,这就直接证明了整个流程只进行了一次遍历。
内容的提问来源于stack exchange,提问作者Thomas Metrier




