集合框架(一):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);
}
}