前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 8 及其后续版本的新遍历 forEach

Java 8 及其后续版本的新遍历 forEach

原创
作者头像
HoneyMoose
修改2021-09-08 10:54:06
6720
修改2021-09-08 10:54:06
举报
文章被收录于专栏:CWIKIUSCWIKIUS

Java 的 List 遍历通常会使用迭代器(Iterator)来进行遍历

Iterator 与 Iterable

Iterator 为 Java中的迭代器对象,是能够对 List 这样的集合进行迭代遍历的底层依赖。而 Iterable 接口里定义了返回 Iterator 的方法,相当于对 Iterator 的封装,同时实现了Iterable 接口的类可以支持 for each循环。

forEach method of List in Java
forEach method of List in Java

Java 遍历集合的演进

Java 最开始设计的时候都会使用迭代器来对集合进行遍历。

类似下面的写法是不是非常熟悉,在定义集合后,然后使用迭代器,然后使用迭代器中的 hasNext() 方法来完成遍历。

代码语言:javascript
复制
        List<String> testList = Arrays.asList("A", "B", "C");

        Iterator iterator = testList.iterator();
        while (iterator.hasNext()) {
            logger.debug((String) iterator.next());

        }

上面的代码运行后,我们会知道输出应该为:A,B,C

使用 for 循环

因为上面的方法有时候会出点问题,比如说空对象异常呀。

或者通常没有办法获得当前遍历的下标等等。

然后就有很多人会开始使用一个 for 循环。

代码语言:javascript
复制
        List<String> testList = Arrays.asList("A", "B", "C");

        logger.debug("--- FOR ---");
        for (int i = 0; i < testList.size(); i++) {
            logger.debug("{} > {}", i, testList.get(i));
        }

当你运行上面的代码后,控制台的输出应该为:

代码语言:javascript
复制
15:38:55.241  [main] DEBUG com.ossez.java8.Java8ForEachUnitTest - --- FOR ---
15:38:55.241  [main] DEBUG com.ossez.java8.Java8ForEachUnitTest - 0 > A
15:38:55.242  [main] DEBUG com.ossez.java8.Java8ForEachUnitTest - 1 > B
15:38:55.242  [main] DEBUG com.ossez.java8.Java8ForEachUnitTest - 2 > C

需要记住的是,Java 中 List 的下标是从 0 开始的。

然后就有点郁闷了,有时候我们会对 List 遍历个多次,然后每次都 i 的话,经常都不知道 i 到最后的 i 的值是多少了。

更有可能的是,一些可爱的代码会用到 i,j ,k,m,n

运气不好会看到好几个。

for 的另外一种写法

针对上面的情况,如果你只是需要遍历的话,你还是可以考虑这样写。

代码语言:javascript
复制
        List<String> testList = Arrays.asList("A", "B", "C");

        logger.debug("--- FOR LOOP ---");
        for (String s : testList) {
            logger.debug(s);
        }

如果需要下标的话,还是可以在里面直接定义一个 i 进行一些操作的。

在 JDK 5 以后的版本中,这种写法越来越多了,通常直接定义 i 的循环就比较少了。

上面的这个代码的可读性就更强一些了。

forEach

这个在 JDK 8 以后就可以这样写了。

代码语言:javascript
复制
        List<String> testList = Arrays.asList("A", "B", "C");

        logger.debug("--- FOR EACH ---");
        testList.forEach(s -> {
            logger.debug(s);
        });

这个是使用的 lambda 表达式的的循环,有点装逼的写法。

基本上和上面 for 的第二种写法差不多,如果你的集合实现了 Iterable 接口的话,通常就可以这样写了。

如果你能读读 JDK 源代码的话,就知道 Iterable 对迭代器进行了封装。

foreach-01
foreach-01

forEach 比直接 for 要高端一点点。

总结

不管采用什么样的写法,第一种直接迭代的写法是比较少见的。

通常不使用迭代器直接写的原因是集合不好操作。

Java 的遍历方式也越来越方便了,具体希望怎么遍历还是通过具体问题具体分析。掌握 1 到 2 种遍历方式基本上也够用了。

https://www.ossez.com/t/java-8-foreach/13725

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Iterator 与 Iterable
  • Java 遍历集合的演进
    • 使用 for 循环
      • for 的另外一种写法
        • forEach
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档