代码清单1:使用枚举处理字符串向量 List names = new LinkedList(); names.add("Apple"); names.add("Orange"); Iterator i = names.iterator(); while (i.hasNext()) { String name = (String) i.next(); System.out.println(name); } 代码清单2:使用迭代器处理字符串列表 Java 1.2推出了集合类(Collections),并通过一个迭代器类(Iterator)实现了迭代器设计模式。因为当时在Java 1.2中还没有泛型,所以对迭代器返回的对象进行强制类型转换仍然是必要的。对于Java版本1.2至1.4,遍历字符串列表如代码清单2所示。 Java 5给出了泛型、Iterable接口和增强for循环。在增强for循环中,迭代器的创建和调用它的hasNext()和next()方法都发生在幕后,不需要明确地写在代码中,因此代码显得更为紧凑。使用Java 5,我们的例子类似代码清单3所示,请注意,在Java 5我们使用的仍然是主动迭代器。 List names = new LinkedList(); names.add("Apple"); names.add("Orange"); for (String name : names) System.out.println(name); 代码清单3:使用泛型和增强for循环 List names = new LinkedList<>(); names.add("Apple"); names.add("Orange"); names.forEach(name-> System.out.println(name)); 代码清单4:Java8使用forEach()方法进行迭代 Java 7为了避免泛型的冗长给出了钻石运算符<>,从而避免了使用new运算符实例化泛型类时重复指定数据类型。从Java 7开始,代码清单3中的第一行可以简化成以下形式:List names = new LinkedList<>(); 3 Java 8中的迭代(Iteration in Java 8) 3.1 forEach()方法 Java8为我们提供了新的迭代途径,它使用lambda表达式开展集合的遍历。Java8最主要的新特性就是lambda表达式以及与此相关的特性,如流(streams),方法引用(method references)和功能接口(functional interfaces)。正是因为这些新特性使我们能够使用被动迭代器而不是传统的主动迭代器,特别是Iterable接口提供了一个被动迭代器的缺省方法(default method)叫做forEach()。缺省方法是Java 8的又一个新特性,是一个接口方法的缺省实现,在这种情况下,forEach()方法实际上是用类似于代码清单3的主动迭代器方式来实现的。 实现了Iterable接口的集合类(如:所有列表List、集合set)现在都有一个forEach()方法,这个方法接收一个功能接口参数,实际上传递给forEach()方法的参数是一个lambda表达式。使用Java 8的功能,我们的例子将演变成代码清单4中所示的形式。 |