【java】for-each 循环

翻译 2018年04月17日 13:56:32

详情参看 oracle 官方文档: The For-Each Loop

Iterator 类提供的迭代方法:代码丑陋,Iterator 实例出现了三次容易出现错误

    @Test
    public void iteratorTest() {
        List<String> names = this.createList();
        for (Iterator<String> i = names.iterator(); i.hasNext();) {
            LOGGER.debug("name is {}", i.next());
        }
    }

    private List<String> createList() {
        List<String> names = new ArrayList<>();
        names.add("小明");
        names.add("小强");
        names.add("小红");
        return names;
    }

for-each 循环:代码简洁,避免实例变量的重复出现,规避了代码风险;

    @Test
    public void forEachNewTest() {
        List<String> names = this.createList();
        for (String name:names) {
            LOGGER.debug("name is {}", name);
        }
    }
释义 :冒号可以看做是 " in.",上面的循环翻译过来就是  "for each String in names". for-each 循环 是和 泛型(generics)的完美结合,在保持类型安全的同时,移除了丑陋的代码:即不需要声明一个泛型,也不需要声明一个 Iterator 迭代器(编译器会自己处理)。

常见的 迭代器 Iterator  使用错误示例:

    @Test
    public void mistakeTest() {
        List<String> names = this.createList();
        List<String> fruits = this.createFruit();
        List<Person> source = new ArrayList<>();
        for (Iterator<String> i1 = names.iterator(); i1.hasNext();) {
            for (Iterator<String> i2 = fruits.iterator(); i2.hasNext();) {
                source.add(new Person(i1.next(), i2.next()));
            }
        }
    }

    private List<String> createList() {
        List<String> names = new ArrayList<>();
        names.add("小明");
        names.add("小强");
        names.add("小红");
        names.add("小张");
        return names;
    }

    private List<String> createFruit() {
        List<String> fruits = new ArrayList<>();
        fruits.add("apple");
        fruits.add("orange");
        return fruits;
    }

    private class Person {
        private String name;
        private String fruit;

        public Person() {
        }

        public Person(String name, String fruit) {
            this.name = name;
            this.fruit = fruit;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getFruit() {
            return fruit;
        }

        public void setFruit(String fruit) {
            this.fruit = fruit;
        }
    }

最后生成的 source list 集合中只有四条数据,并不是我们想要的结果,原因是 外部集合(name)对应的 迭代器 的 next 方法被调用了太多次,内部集合(fruits) 和 外部集合(names) 对应的 迭代器对象的 next 方法 在 内部循环中都被调用。修复这个错误的示例代码:source 的 list 集合中有 8 个 对象。

    @Test
    public void mistakeFixTest() {
        List<String> names = this.createList();
        List<String> fruits = this.createFruit();
        List<Person> source = new ArrayList<>();
        for (Iterator<String> i1 = names.iterator(); i1.hasNext();) {
            String name = i1.next();
            for (Iterator<String> i2 = fruits.iterator(); i2.hasNext();) {
                source.add(new Person(name, i2.next()));
            }
        }
    }

for-each 循环是为 嵌套循环 而定制的,不会产生以上的错误:

    @Test
    public void mistakeForEachTest() {
        List<String> names = this.createList();
        List<String> fruits = this.createFruit();
        List<Person> source = new ArrayList<>();
        for (String name:names) {
            for (String fruit:fruits) {
                source.add(new Person(name, fruit));
            }
        }
        LOGGER.debug("source size is {}", source.size());
    }

for-each 循环 同样适用于 数组 ,当循环数组时,隐藏的是 数组的位置索引,而集合隐藏的是 迭代器对象。

使用 for-each 的好处有很多,美化代码,避免错误,但也不是所有的地方都能用 for-each 循环,例如,如果你想循环集合,并根据条件删除 或者 替换 集合中符合条件的元素时,因为不能调用到 Iterator 实例来  删除或者 替换,所以这种情况下不能使用 for-each 循环。另外,对于 并行遍历多个集合 循环也是不可用的。

    @Test
    public void filterTest() {
        List<String> fruits = this.createFruit();
        for (Iterator<String> i = fruits.iterator(); i.hasNext();) {
            if (i.next().length() == 5) {
                i.remove();
            }
        }
        LOGGER.debug("fruits list size is {}", fruits.size());
    }

Java中For-Each循环的使用

for-each这种集合的遍历方法最初是在Perl中接触的foreach。开始的时候受C语言的影响多少有些不习惯,不过写了两段代码之后就觉得十分适应了,因为这种描述方式与我们的日常表达语言十分相似。再...
  • grey_csdn
  • grey_csdn
  • 2017-03-13 01:15:27
  • 896

XSL控制循环次数

XSL需要添加循环的情况有:自定义循环次数;根据源XML文件中有重复的标签等等。 对于源XML有重复标签的又可以分为“可套用一个模板的内容”在一个标签内,和不在一个标签内 举个栗子: 33 ...
  • yintianqin
  • yintianqin
  • 2017-03-30 11:03:44
  • 628

For-each循环优于for循环感悟

For-each是java1.5之后才推行的版本,它的优势在于可以完全隐藏迭代器或者是索引变量,避免了混乱和出错的可能,不会有性能的损失。for(Element e : elements){ ...
  • chai_ge_ge
  • chai_ge_ge
  • 2017-08-10 22:38:35
  • 336

XSL中利用xsl:for-each时给每一项添加序号

经常用for-each来循环读取XML中的某个节点集,但常常需要加上序号这样来做:         当然,如果你不满意,想在数字后面加上"."可以这样:     甚至,你可以用用图片表示1/2/3等:...
  • lincnl
  • lincnl
  • 2007-08-28 14:52:00
  • 1291

JAVA 知识点(for-each)遍历的用法)

public class TestForInterator { public static void main (String args[]){ int[] intArra...
  • zx84289061
  • zx84289061
  • 2012-10-13 13:45:48
  • 1654

Java for-each循环

常见循环java目前常见的循环主要有3种: 1.iterator循环 List list = new ArrayList(); for (Iterator iterat...
  • u011656266
  • u011656266
  • 2016-05-12 23:15:58
  • 285

我们能自己写一个容器类,然后使用 for-each 循环码?

今天继续分享一道Java经典面试题:    直接上题:    我们能自己写一个容器类,然后使用 for-each 循环吗?    可以,你可以写一个自己的容器类。如果你想使用 Java 中增强的...
  • qq_32575047
  • qq_32575047
  • 2017-12-31 20:33:54
  • 170

斗地主发牌

  • 2018年01月25日 14:58
  • 3KB
  • 下载

XSL for-each 总结

2013-04-28 2013-04-30 USD 100000 2004-04-30 ...
  • lixuekun820
  • lixuekun820
  • 2012-12-25 15:16:03
  • 1603
收藏助手
不良信息举报
您举报文章:【java】for-each 循环
举报原因:
原因补充:

(最多只允许输入30个字)