探索 Java 迭代器模式高阶玩法:像专业导游带你畅游数据集合

108 阅读3分钟

在 Java 的世界里,迭代器模式就像是一个贴心的导游,专门负责带我们轻松游览各种数据集合。今天,咱就来唠唠这个迭代器模式的高阶使用,保证让你收获满满,代码水平 “蹭蹭” 往上涨!

一、基础回顾:迭代器模式是啥玩意儿?

简单来说,迭代器模式就像是给数据集合配上了一个导航仪。它能让我们在不了解集合内部结构的情况下,轻松地遍历其中的元素。就好比你去一个超大型迷宫旅游,不需要知道迷宫的具体构造,只要跟着导游(迭代器)走,就能把每个角落都逛到。

在 Java 中,我们常用的 ArrayList、LinkedList 等集合类都已经内置了迭代器。比如这样遍历 ArrayList:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorBasicDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("苹果");
        list.add("香蕉");
        list.add("橘子");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String fruit = iterator.next();
            System.out.println(fruit);
        }
    }
}

这就是迭代器模式的基本操作,是不是超级简单?但这只是个 “开胃菜”,高阶玩法还在后面呢!

二、高阶玩法一:自定义迭代器

有时候,内置的迭代器可能无法满足我们的特殊需求。这时候,就该自定义迭代器闪亮登场啦!假设我们有一个存储学生成绩的数组,我们想要自定义一个迭代器,只遍历成绩大于 90 分的学生。

class HighScoreIterator implements Iterator<Integer> {
    private int[] scores;
    private int index = 0;
    public HighScoreIterator(int[] scores) {
        this.scores = scores;
    }
    @Override
    public boolean hasNext() {
        while (index < scores.length) {
            if (scores[index] > 90) {
                return true;
            }
            index++;
        }
        return false;
    }
    @Override
    public Integer next() {
        if (hasNext()) {
            return scores[index++];
        }
        return null;
    }
}

然后就可以像这样使用我们自定义的迭代器:

public class CustomIteratorDemo {
    public static void main(String[] args) {
        int[] scores = {85, 92, 95, 88, 98};
        HighScoreIterator iterator = new HighScoreIterator(scores);
        while (iterator.hasNext()) {
            System.out.println("高分学生成绩:" + iterator.next());
        }
    }
}

这样,我们就轻松地实现了自定义条件的迭代,是不是很酷炫?

三、高阶玩法二:迭代器的嵌套使用

当我们面对多维数据结构时,迭代器的嵌套使用就派上大用场了。想象一下,我们有一个班级的学生信息,每个学生又有好几门课程的成绩。这时候,我们可以用外层迭代器遍历学生,内层迭代器遍历每个学生的课程成绩。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class Student {
    private String name;
    private List<Integer> scores;
    public Student(String name, List<Integer> scores) {
        this.name = name;
        this.scores = scores;
    }
    public Iterator<Integer> getScoreIterator() {
        return scores.iterator();
    }
}
public class NestedIteratorDemo {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        List<Integer> scores1 = new ArrayList<>();
        scores1.add(90);
        scores1.add(88);
        students.add(new Student("张三", scores1));
        List<Integer> scores2 = new ArrayList<>();
        scores2.add(95);
        scores2.add(92);
        students.add(new Student("李四", scores2));
        Iterator<Student> studentIterator = students.iterator();
        while (studentIterator.hasNext()) {
            Student student = studentIterator.next();
            System.out.println(student.name + "的成绩:");
            Iterator<Integer> scoreIterator = student.getScoreIterator();
            while (scoreIterator.hasNext()) {
                System.out.println(scoreIterator.next());
            }
        }
    }
}

通过这种嵌套迭代器的方式,我们可以优雅地处理复杂的数据结构,就像剥洋葱一样,一层一层轻松搞定。

四、高阶玩法三:迭代器与 Lambda 表达式结合

Java 8 的 Lambda 表达式可是个 “神器”,和迭代器结合起来使用更是如虎添翼。比如,我们想要对一个集合中的元素进行某种操作并打印结果,使用 Lambda 表达式和迭代器可以这样写:

import java.util.ArrayList;
import java.util.List;
public class IteratorLambdaDemo {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.forEach(num -> System.out.println("数字的平方:" + num * num));
    }
}

这里的 forEach 方法内部其实就是使用了迭代器,结合 Lambda 表达式,让代码变得简洁又高效,看起来超酷!

迭代器模式在 Java 中的高阶使用可不止这些哦!它就像一个宝藏,还有很多隐藏的技能等待我们去挖掘。希望大家在实际开发中多去尝试,让代码变得更加优雅和高效。下次再和大家分享更多 Java 的有趣知识,敬请期待!