如何在链式调用map、reduce、filter时减少迭代次数?
关于函数式编程链式操作与Java Streams的效率优化思路
Hey there! 我最近一直在深挖 map、reduce 和 filter 这几个函数,毕竟它们在 React 和函数式编程(FP)里的应用实在太广泛了。
不过我发现一个关键细节:如果直接写这类函数的链式调用代码(比如 filter().map().reduce() 这种写法),底层其实会执行3次独立的循环——每调用一个方法就完整遍历一次集合,数据量小的时候差异不明显,但数据量大的话,这种多次遍历的开销就会被放大。
后来我研究了Java 8的Streams API,发现它用了一种叫*monad(单子)*的概念来解决这个效率问题。简单来说,Streams的设计思路是先把所有的计算逻辑(比如过滤、映射这类中间操作)都存储起来,不会立刻执行;直到你调用终端操作(比如collect、forEach)的时候,才会一次性遍历集合,把所有存储的逻辑在这一次迭代里全部完成。
举个Java Streams的实际例子:
List<String> words = Arrays.asList("hello", "world", "java", "stream"); List<String> result = words.stream() .filter(word -> word.length() > 3) .map(String::toUpperCase) .collect(Collectors.toList());
这里的filter和map都是中间操作,只会定义要执行的逻辑,不会立刻处理数据;只有当调用collect这个终端操作时,才会启动一次遍历,同时完成过滤和转换操作,完美避免了多次循环的开销。而且不止Java,很多其他语言也采用了类似的延迟执行机制来优化这类函数式链式操作~
内容的提问来源于stack exchange,提问作者ayushgp
相关产品推荐
相关产品推荐

