首页 > 其他分享 >琐碎的想法(五)for 的前世今生

琐碎的想法(五)for 的前世今生

时间:2023-01-11 18:24:03浏览次数:47  
标签:今生 iterator expr list while 前世 forEach 琐碎 循环

for

起因

记得大学上C语言的课,第一次遇到的问题就是循环结构里面的 for

选择结构的 if 非常易懂,和日常生活的判断没有区别。

循环结构的 while 同样比较好理解。

本质上是一个判断

  • 如果为真,继续循环。
  • 如果不假,则退出循环。

for 会稍微复杂一些。

for (init-expr; test-expr; update-expr)
    body-statement
  1. 初始化表达式只执行一次
  2. 判断表达式执行
    • 判断为真执行循环体
    • 判断为假退出循环体
  3. 执行更新表达式

在实际的语义等同于(唯一区别是init-expr一个是内部变量,一个是外部变量)

    init-expr
    while (test-expr) {
        body-statement
        update-expr
    }

那么我们为什么要设计一个不那么好理解的循环结构呢?

因为这时候才入了编程的门————抽象,以及约定。

如果我们再往底层挖,会发现在汇编语言中是不存在whilefor 关键字的。

最开始的程序总是从左到右,从上到下一条路走到黑的。

后面编程人员意识到编写重复的代码过于麻烦才创造了 loop

所以最开始需要人工写一个for或者while循环。

while 好理解在于和自然语言(英语)完全符合。

    当 条件满足 时, {
        执行 流程;
    }

for 循环的好处在于规范了 while 的使用。

  1. 初始化语句(init-expr)一般只用于循环,所以放在内部,便于回收变量。
  2. 循环条件(test-expr)一般配合更新语句一起使用(update-expr),实现循环有限次数。
  3. 三者的拆分使编写大段的循环或者嵌套循环时,更易读。
// 传统while循环
    int i = 0;
    while (i < 10) {
        handleX();
        i++;
        int j = 0;
        while (j < 5) {
            handleY();
            j++;
        }
    }
// for循环
    for (int i = 0; i < 10; i++) {
        handleX();
        for (int j = 0; j < 5; j++) {
            handleY();
        }
    }

所以 for 循环的出现也意味着编程人员开始在意的不仅仅是功能,而且看重可读性。

然而这并不会被满足。

之后还出现了

  1. 增强 for,部分语言的for-each,for...in
  2. lamdba 表达式中的 forEach() 方法。

注意:以下按 Java 实现的 foreach 举例。(其他编程语言不太熟悉)

增强 for

foreach 的规则

  1. 所有使用 foreach 的集合都必须实现 Iterable 接口
  2. 通过 iterator() 获取 iterator 对象
  3. 通过 iterator.hasNext() 判断是否存在元素。
  4. 通过 iterator.next() 获取下一个元素。
  5. 通过 iterator.remove() 移除返回的元素。(可选)

增强 for 的语法

    List<String> list = Arrays.asList("1", "2", "3", "4", "5");
    // for 版本
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i));
    }
    // foreach 版本
    for (String e : list) {
        System.out.println(e);
    }
    // 去"糖"后的while版本
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }

可以看出,foreach 对于 for、while 来说,好处是更加简单,符合直觉。

  1. 无需判断集合个数和中间变量减少代码出错可能性,统一通过 hasNext() 处理。
  2. 不用分析每个集合类如何获取元素,统一通过 next() 处理。
  3. 通过语法糖隐藏了 hasNext(), next() 逻辑,代码更易读。

forEach()

Java 7/8 受到了函数式语言的影响,实现了更简练的写法。

    // Iterable<T> 内实现的forEach
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    List<String> list = Arrays.asList("1", "2", "3", "4", "5");
    // forEach()
    list.forEach(i -> System.out.print(i));
    // 方法引用
    list.forEach(System.out::print);

可以看出,forEach()的好处显而易见。

  1. 代码量比 foreach 更少,只关注遍历元素,甚至连元素类型都可以省略。
  2. 使用了方法引用后更进一步,我们关注的是这个集合执行了哪些操作,遍历每一次的含义在forEach()的方法已经体现了,甚至不需要写遍历的元素。

总结

可以看出,编程人员一直追寻的是更简单,更易读的代码。

  • 他们不满足于汇编语言一遍遍的写同一行代码,创造了 while
  • 不满足于 复杂或多层 while 的不可读, 创造了 for
  • 不满足于 for 循环每一次定义的中间变量,创造了 foreach
  • 不满足于 foreach 需要循环每一次的元素,利用了lamdba 的 Consumer, 去掉了元素。

标签:今生,iterator,expr,list,while,前世,forEach,琐碎,循环
From: https://www.cnblogs.com/kwanwoo/p/17044587.html

相关文章

  • ESNI 和ECH的前世今生
    ​​这边文章​​中提到过虽然TLS能够加密整个通信过程,但是在协商的过程中依旧有很多隐私敏感的参数不得不以明文方式传输,其中最为重要且棘手的就是将要访问的域名,即SNI(S......
  • DevOps的前世今生
    导语​​DevOps​​诞生已经13年了,你理解他吗?为什么相伴了13年,你仍然对他不甚了了呢?你真的以为​​DevOps​​是一个筐,什么东西都可以往里装吗?你以为DevOps落地就是找一个JI......
  • ChatGPT的前世今生
    前言自美国时间12月2日上线以来,美国硅谷的初创公司OpenAI推出的ChatGPT,已经拥有超过一百万的用户,受到热烈的讨论。它既能完成包括写代码,修bug(代码改错),翻译文献,写小说,写商......
  • 一文读懂验证码的前世今生
    俗话说得好,“常在网上走,哪有不验证”。我们爱也好、恨也罢,每天谁不抓耳挠腮输入几个验证码呢?想象个场景:马上春运了,登录12306网站,发现还有最后一张余票,正准备下单......
  • 【百家稷学】卷积神经网络的前世、今生与未来(武汉工程大学技术分享)
    最开始做我们这个技术公众号的时候,我定了3个层次的目标。第1层目标,输出100万字原创技术文章,去年年中的时候已经达成。第2层目标,走进100所高校和100个企业进行学习与分享,如今......
  • Android 轻量级存储方案的前世今生【SharedPreferences、MMKV、Jetpack DataStore】
    背景对于Android轻量级存储方案,有大多数人都很熟悉的SharedPreferences;也有基于mmap的高性能组件MMKV,底层序列化/反序列化使用protobuf实现,性能高,稳定性强;还有Jetp......
  • Serverless 的前世今生
    作者:刘宇(江昱)从云计算到Serverless架构大家好,我是阿里云Serverless产品经理刘宇,很高兴可以和大家一起探索Serverless架构的前世今生。从云计算到云原生再到Server......
  • 华为云Astro的前世今生:用7年时间革新低代码开发观念​
    2022年华为全联接大会(HUAWEICONNECT)期间,华为云CEO张平安发布华为云Astro低代码平台,让科技迷们意犹未尽。短短7年,『华为云Astro』迅速崛起,不仅扭转了中国企业数字化转型的命......
  • Serverless 的前世今生
    作者:阿里云用户组从云计算到Serverless架构大家好,我是阿里云Serverless产品经理刘宇,很高兴可以和大家一起探索Serverless架构的前世今生。从云计算到云原生再到......
  • 华为云Astro的前世今生:用7年时间革新低代码开发观念
    摘要:深扒华为云Astro低代码平台的前世今生,其成功之路显然是一条“个性”之路。本文分享自华为云社区《​​华为云Astro的前世今生:用7年时间革新低代码开发观念​​》,作者:华......