【从零开始学JAVA | 第二十四篇】单列集合的遍历

目录

前言:

单列集合的遍历方式:

迭代器遍历:

增强for遍历:

lambda方法遍历: 

总结:


前言:

本篇我们会讲解关于单列集合的几种遍历方式,遍历集合可以说是对于集合要求掌握的最低技能,因此我们要熟练的掌握遍历集合的方式。

在这里我们不讲for循环遍历,for循环无法对单列集合的set子集合进行遍历,因为set集合的特点就是无序,无法用索引进行遍历。

单列集合的遍历方式:

迭代器遍历:

在ES6中,为了方便遍历collection数据结构,引入了可迭代协议(Iterable protocol)迭代器协议(Iterator protocol)。这两个协议一起实现了遍历collection的能力。

可迭代协议指定了collection必须实现一个名为[Symbol.iterator]的方法,该方法返回一个迭代器对象。而迭代器对象则定义了一个next()方法,该方法返回一个包含value和done属性的对象,value表示当前的值,done属性表示当前是否遍历完毕。

JavaScript中有一些内置的可迭代对象,如数组(Array)、Set、Map、字符串(String)和arguments等。按照可迭代协议的规范,这些collection对象都必须实现[Symbol.iterator]方法,返回一个符合迭代器协议规范的对象。

常用的iterator方法:

  1. next():返回一个包含value和done属性的对象,value表示当前遍历的值,done表示遍历是否已经结束。

  2. return():用来提前结束迭代,然后返回一个包含value和done属性的对象,value表示提前结束时的返回值,done属性为true。

  3. throw():用来主动抛出一个异常,用于在迭代过程中遇到错误或异常时中止遍历。

案例:

import java.util.Iterator;

public class text05 {
    public static void main(String[] args) {
        String list="abide";
        Iterator<String> it=list.lines().iterator();
        String str=it.next();
        System.out.println(str);
    }
}

在这段Java代码中,`list` 是一个字符串变量,调用了 `lines()` 方法并 `iterator()` 方法将其转换为一个字符串数组对应的迭代器对象,并将该迭代器对象赋值给了 `it` 变量。`it.next()` 方法获取迭代器中的下一个元素,即字符串数组中的第一个元素,并将其赋值给了 `str` 变量。最后将 `str` 变量的值打印到控制台中。

因为 list 变量中只有一个字符串 "abide",所以 list.lines() 返回只包含一个元素的字符串数组 ["abide"],且由于是调用了 iterator() 方法,获取了对应数组的迭代器对象。所以打印的结果是 "abide"。

除了数组,其他collection对象如Set、Map和字符串等也都可以使用迭代器遍历。

虽然迭代器可以快速指向容器中的元素,但是我们不可以简单的认为迭代器就是指针。

在 Java 中,迭代器是一种对象,它允许我们遍历集合或列表等容器中的元素。迭代器的本质是在提供一种通用的方法,以便我们可以访问集合类的内部元素,而无需暴露容器内部的实现细节。这个特性使得我们能够使用同样的方式遍历不同类型的容器,同时保持容器类的封装性。

迭代器的本质包含两个方面,一是能够访问容器内部的元素,二是能够支持前移、后移与删除等操作。在具体实现中,迭代器通常会持有对容器对象的引用,并且会提供 next()、hasNext()、remove() 等方法来实现元素的访问与控制操作。此外,Java 迭代器还具有一些重要特性,如快速失败机制,支持并发访问等,以保障程序的正确性和可靠性。

增强for遍历:

Java 中的增强 for 循环是一种简化遍历数组或集合的语法。它可以在不显式定义循环计数器或迭代器的情况下,遍历循环中的每个元素。下面是示例代码:

int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
    System.out.println(number);
}

这段代码将创建一个整数数组,然后使用增强 for 循环遍历该数组。在每个循环迭代中,增强 for 循环将从数组中取出一个元素,并将其存储在名为 number 的变量中。

其实增强for循环的底层就是迭代器,是我们为了简化迭代器的代码书写而创造出来的。 

Java 中的增强 for 循环可以用于遍历任何实现了 Iterable  接口的集合对象。

案例:

List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));
for (String name : names) {
    System.out.println(name);
}

这段代码将创建一个字符串列表,并使用增强 for 循环遍历该列表中的每个元素。

需要注意的是,增强 for 循环仅用于遍历操作,它并不能用于修改集合中的元素。如果需要在循环中修改集合中的元素,应使用传统的 `for` 循环或迭代器进行遍历。

增强for循环的特点:

1. 简洁易读:增强 for 循环可以让代码更加简洁易读,特别是在遍历数组或集合等容器类型时,可以省略掉繁琐的索引或迭代器等操作。

2. 安全性:增强 for 循环是一种类型安全的循环,即在编译时就能够检查类型匹配,从而避免了运行时的类型转换错误。

3. 效率低下:虽然增强 for 循环简洁易读,但在一些性能要求较高的场景下,它的效率可能会比传统的 for 循环或迭代器遍历低下。这是因为增强 for 循环需要在每次循环迭代中执行一次数组或集合对象的访问操作,造成了一些额外的性能损失。

总的来说,增强 for 循环适用于那些简单的遍历操作,可以提高代码可读性和维护性。但对于复杂的遍历场景,应使用传统的 for 循环或迭代器来实现遍历。

lambda方法遍历: 

Lambda 是 Java 8 引入的一个新特性,它可以简化对匿名类的使用,使得代码更加简洁易读。Lambda 表达式可以传递为方法参数,类似于传递一个函数或代码块,可以大幅度减少代码和 API 的复杂性。下面是一个 Lambda 的示例代码:

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
list.forEach((n) -> System.out.println(n));

这段代码将创建一个整数列表,然后使用 forEach 方法遍历该列表并打印出每个元素。在这里,我们使用了一个 Lambda 表达式 (n) -> System.out.println(n) 来作为 forEach 方法的参数,其中 `(n)` 是 Lambda 表达式的形参列表,`->` 是 Lambda 运算符,而 `System.out.println(n)` 则是 Lambda 表达式的函数体

在这个例子中,Lambda 表达式可以理解为一个简单的匿名函数,接受一个整数参数 `n` 并将其打印出来。与传统的匿名类相比,使用 Lambda 表达式可以让代码更加简洁明了,同时避免了创建额外的匿名类对象带来的性能和内存开销。

除了 forEach 方法,Lambda 表达式还可以用于任何接受函数式接口作为参数的方法,例如:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().mapToInt(n -> n).sum();
System.out.println(sum);

这段代码使用了 Java 8 的流式 API,将整数列表转换为流并调用 `mapToInt` 方法将每个元素转换为整数类型并求和。在这里,`(n -> n)` 代表了一个简单的 Lambda 表达式,接受一个整数参数并返回其本身。

Lambda 表达式的特点:

1. 简洁易读:Lambda 表达式可以显著地简化匿名类的语法,使得代码更加简洁易读。

2. 传递行为:Lambda 表达式可以看作是传递行为的一种方式,它可以作为方法参数传递,从而提供了一种灵活的、可重用的代码块。

3. 高效性:Lambda 表达式可以提高代码的效率和性能,尤其是在并发或集合处理等场景下,可以节省时间和内存开销。

4. 类型推导:Java 8 引入的类型推导机制使得 Lambda 表达式可以在某些情况下省略参数类型,并减少代码冗余。

5. 闭包和变量捕获:Lambda 表达式可以捕获代码块内的变量,从而形成闭包。这使得 Lambda 表达式可以访问局部变量和对象字段等状态,从而实现更加灵活和功能强大的行为。

总之,Java 中的 Lambda 表达式是一种便捷、高效、灵活的编程方式,可以在很多场景下实现代码重用和灵活组合。它的使用可以提高代码的可读性和维护性,同时也可以降低代码的复杂性和错误率。

总结:

        我们必须掌握前两种对单列集合的遍历,最后一个lambda可以选择性的掌握,单列集合的遍历方法还有很多,我们在这里只是给大家介绍了几个最常用的遍历方式。

如果我的内容对你有帮助,请点赞,评论,收藏创作不易,大家的支持就是我坚持下去的动力!

69e9169c980f43e0aad31ff9ada88a9c.png

猜你喜欢

转载自blog.csdn.net/fckbb/article/details/131409058