Java 高效编程·函数式替代 for 循环

作者 : jamin 本文共1311个字,预计阅读时间需要4分钟 发布时间: 2020-10-18 共983人阅读

函数式替代 for 循环

举个栗子

以一个简单的循环打印为例:

for(int i = 1; i < 4; i++) {
    System.out.print(i + "...");
}

IntStream.range(1, 4)
        .forEach(i -> System.out.print(i + "..."));

虽然使用 range 没有显著减少代码量,但降低了它的复杂性,这么做的两个重要原因:

  • 不同于 forrange 不会强迫我们初始化某个可变变量。
  • 迭代会自动执行,所以我们不需要像循环索引一样定义增量。

可变变量与参数

for 循环中定义的变量 i 是单个变量,它会在每次对循环执行迭代时发生改变。range 示例中的变量 i 是拉姆达表达式的参数,所以它在每次迭代中都是一个全新的变量。

如果想在循环中的一个内部类中使用索引变量,若使用传统 for 循环,每次新的迭代都需要创建一个局部临时变量 temp,它是索引变量的一个副本:

ExecutorService executorService = Executors.newFixedThreadPool(10);

// 传统 for 循环
for(int i = 0; i < 5; i++) {
    int temp = i;
    executorService.submit(() -> System.out.println("Running task " + temp));
}

// IntStream range
IntStream.range(0, 5)
        .forEach(i -> executorService.submit(() -> System.out.println("Running task " + i)));

executorService.shutdown();

对于相对简单的迭代,使用 range 代替 for 具有一定优势,但 for 的特殊价值体现在于它能处理更复杂的迭代场景。

封闭范围

IntStream rangeClosed 可以创建一个封闭范围:

for(int i = 0; i <= 5; i++) {}

IntStream.rangeClosed(0, 5)

跳过值

对于基本循环,rangerangeClosed 方法是 for 的更简单、更优雅的替代方法。对于需要跳过值,两者比较:

for(int i = 1; i <= 100; i = i + 3) {}

IntStream.iterate(1, e -> e + 3)
        .limit(34)
        .sum()

IntStream iterate 方法需要两个参数;第一个是开始迭代的初始值,第二参数传入的拉姆达表达式决定了迭代中的下一个值。但是它有个弊端:iterate 没有参数来限制方法何时停止迭代。解决这个问题需要提前计算迭代次数,这里使用 limit 方法,这种方式容易出问题。

Java 9 中引入的 takeWhile 新方法使得执行有限制的迭代变得更容易,可以直接表明只要满足想要的条件,迭代就应该继续执行:

IntStream.iterate(1, e -> e + 3)
        .takeWhile(i -> i <= 100)
        .sum()

takeWhile 方法相反的是 dropWhile,它跳过满足给定条件前的值。takeWhile 方法类似于 break,而 dropWhile 则类似于 continue

参考文章:
传统 for 循环的函数式替代方案

本站所提供的部分资源来自于网络,版权争议与本站无关,版权归原创者所有!仅限用于学习和研究目的,不得将上述内容资源用于商业或者非法用途,否则,一切后果请用户自负。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源。如果上述内容资对您的版权或者利益造成损害,请提供相应的资质证明,我们将于3个工作日内予以删除。本站不保证所提供下载的资源的准确性、安全性和完整性,源码仅供下载学习之用!如用于商业或者非法用途,与本站无关,一切后果请用户自负!本站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。如有侵权、不妥之处,请联系站长以便删除!
金点网络-全网资源,一网打尽 » Java 高效编程·函数式替代 for 循环

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
是否提供免费更新服务?
持续更新,永久免费
是否经过安全检测?
安全无毒,放心食用

提供最优质的资源集合

立即加入 友好社区
×