当前位置: 首页 > article >正文

集合框架(一):Collection集合的遍历方式

一.迭代器遍历Collection集合

package com.njau.d2_collection_traverse;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 目标:Collection集合的遍历方式一:使用迭代器Iterator对象遍历Collection集合
 */
public class CollectionDemo01 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("成龙");
        c.add("老爹");
        c.add("小玉");
        c.add("特鲁");

        // 1、Collection集合获取迭代器的方法:Iterator<E> iterator()  返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素
        Iterator<String> it = c.iterator();

        // 2、Iterator迭代器中的常用方法:1、boolean hasNext()  询问当前位置是否有元素存在,有返回true,不存在返回false
        //                            2、E next()  获取当前位置的元素,并同时将迭代器对象指向下一个元素处
//        System.out.println(it.next());  // 成龙
//        System.out.println(it.next());  // 老爹
//        System.out.println(it.next());  // 小玉
//        System.out.println(it.next());  // 特鲁
//        System.out.println(it.next());  // 会出bug,因为已经没有元素了
        // 使用循环遍历
        while (it.hasNext()) {
            String ele = it.next();
            System.out.println(ele);
        }
    }
}

next()方法用来获取当前元素,并将迭代器对象指向下一个元素,此处代码2中连续使用next()方法,会使得迭代器对象连续后移两次,如果指向了空元素,那么就会报错。因此一定要保证使用迭代器对象时判断一次(hasnext),获取一次,后移一次。

二.增强for循环

 

package com.njau.d2_collection_traverse;

import java.util.ArrayList;
import java.util.Collection;

/**
 * 目标:掌握遍历Collection集合的方式二:使用增强for循环
 * for(元素的数据类型 变量名 :数组或者集合) {
 *     ...
 * }
 * 增强for可以用来遍历集合或者数组
 * 增强for遍历集合,本质就是迭代器遍历集合的简化写法
 */
public class CollectionDemo02 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("成龙");
        c.add("老爹");
        c.add("小玉");
        c.add("特鲁");

        for (String ele : c){
            System.out.println(ele);
        }

        // 还可以用来遍历数组
        String[] names = new String[]{"圣主","塔拉","刀龙","恶魔小龙"};
        for (String name : names) {
            System.out.println(name);
        }
    }
}

三.lambda表达式

package com.njau.d2_collection_traverse;

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;

/**
 * 目标:
 * 使用lambda表达式遍历Collection集合
 */
public class CollectionDemo03 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("成龙");
        c.add("老爹");
        c.add("小玉");
        c.add("特鲁");
        System.out.println(c);

        // default void forEach(Consumer<? super T> action):  结合Lambda表达式遍历集合
//        c.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
//
//        c.forEach((String s) -> {
//                System.out.println(s);
//        });
//
//        c.forEach(s -> {
//            System.out.println(s);
//        });
//
//        c.forEach(s -> System.out.println(s));

        c.forEach(System.out::println);
    }
}

 

结合源码我们可以发现action就是构建出来的Consumer匿名内部类对象,首先检查该action对象是否为null,如果不为null,则内部使用增强for循环,this代表主调方法,即c集合,然后使用增强for循环对该集合进行遍历。每遍历到一个数据,就会将该数据送给这个action对象,这个action就是这个匿名内部类对象,使用该对象的accept方法进行接收。继续遍历第二个对象,继续重复上述操作,直到遍历接收完所有的数据为止。

Consumer接口上方有函数式接口的注解,因此可以使用lambda表达式进行简化。

四.遍历集合元素案例

遍历集合中的电影元素

package com.njau.d2_collection_traverse;

public class Movie {
    private String name;
    private double score;
    private String actor;

    public Movie(String name, double score, String actor) {
        this.name = name;
        this.score = score;
        this.actor = actor;
    }

    public Movie(){};

    public String getName() {
        return name;
    }

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

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    @Override
    public String toString() {
        return "Movie{" +
                "name='" + name + '\'' +
                ", score=" + score +
                ", actor='" + actor + '\'' +
                '}';
    }
}
package com.njau.d2_collection_traverse;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;

/**
 * 目标:
 * 掌握Collection集合对象存储对象内容,完成电影信息的展示
 * new Movie("《肖申克的救赎》",9.7,”罗宾斯“)
 * new Movie("《霸王别姬》",9.6,”张国荣,张丰毅“)
 * new Movie("《阿甘正传》",9.5,”汤姆.汉克斯“)
 */
public class CollectionTest04 {
    public static void main(String[] args) {
        Collection<Movie> movies = new ArrayList<>();
        movies.add(new Movie("《肖申克的救赎》",9.7,"罗宾斯"));
        movies.add(new Movie("《霸王别姬》",9.6,"张国荣,张丰毅"));
        movies.add(new Movie("《阿甘正传》",9.5,"汤姆.汉克斯"));
        System.out.println(movies);

        // 1、使用迭代器Iterator对Collection集合进行遍历
        Iterator<Movie> it = movies.iterator();
        while (it.hasNext()) {
            Movie movie = it.next();
            System.out.println(movie);
        }

        // 2、使用增强for循环进行遍历
        for (Movie movie : movies) {
            System.out.println(movie);
        }

        // 3、使用lambda表达式进行遍历:集合对象Collection c调用c.foreach(new Consumer<Object obj>)方法
//        movies.forEach(new Consumer<Movie>() {
//            @Override
//            public void accept(Movie movie) {
//                System.out.println(movie);
//            }
//        });
//
//        movies.forEach((Movie movie) -> {
//                System.out.println(movie);
//        });
//
//        movies.forEach(movie -> {
//            System.out.println(movie);
//        });
//
//        movies.forEach(movie -> System.out.println(movie));

        movies.forEach(System.out::println);
    }
}

原理如下:


http://www.kler.cn/a/313936.html

相关文章:

  • PNG图片批量压缩exe工具+功能纯净+不改变原始尺寸
  • 速盾:高防 CDN 和 CDN 的缓存机制都一样吗?
  • 基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解
  • 【2024软考架构案例题】你知道 Es 的几种分词器吗?Standard、Simple、WhiteSpace、Keyword 四种分词器你知道吗?
  • C/C++精品项目之图床共享云存储(3):网络缓冲区类和main
  • 使用pdfjs加载多页pdf并实现打印
  • Cypress初次安装启动常见问题
  • Element Plus 中Input输入框
  • JVM 内存管理详解
  • 宝塔面板FTP连接时“服务器发回了不可路由的地址。使用服务器地址代替。”
  • 共轭传热和浸没边界耦合相关的论文的阅读笔记
  • cesium效果不酷炫怎么办--增加渲染器
  • Redis五中数据类型的底层实现
  • nodejs+express+vue教辅课程辅助教学系统 43x2u前后端分离项目
  • mysql-死锁
  • EP16 自定义头部导航栏
  • ubuntu64位系统无法运行32位程序的解决办法
  • C++校招面经(二)
  • Sentinel组件学习
  • 力扣题解815
  • vue 入门一
  • 浪潮信息金风慧能:打造智慧新能源运营平台
  • DMA学习
  • 【pyVista】在三维模型中的网格属性
  • JavaScript发送邮件:实现前端触发的教程?
  • 【VitualBox】VitualBox的网络模式+网络配置