集合框架Iterator接口
1、集合输出
前面我们已经学习了集合的基本操作,很多情况下,我们需要把集合的内容进行输出,也就是遍历集合。
遍历集合的方式有以下几种:
1、 Iterator
2、 ListIterator
3、 Enumeration
4、 foreach
其中Iterator的使用率最高,在JDK1.5后新增的foreach也被大量使用。
2、Iterator
public interface Iterator
对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。
3、ListIterator
public interface ListIterator
extends Iterator
系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。
4、Enumeration
public interface Enumeration
实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。
注:此接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。
5、foreach
在前面的知识讲解中,我们使用foreach来输出数组的内容,那么也可以输出集合中的内容。在使用foreach输出的时候一定要注意的是,创建集合时要指定操作泛型的类型。
List numbers = new ArrayList<>();
JDK1.8新特性:
//no.1
numbers.forEach((Integer integer) -> {System.out.println(integer);});
//no.2
numbers.forEach(integer -> {System.out.println(integer);});
//no.3
numbers.forEach(integer -> System.out.println(integer));
//no.4
numbers.forEach(System.out::println);
//no.5
numbers.forEach(new MyConsumer());
Consumer接口 消费者接口
Function<T,R> 接口 表示接受一个参数并产生结果的函数。
Supplier接口 代表结果供应商。
Predicate接口 断言接口
package com.vince;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* 集合的输出(迭代)
* @author vince
* @description
*/
public class IteratorDemo {
//断言接口Predicate<T>
private static void predicateTest(){
List<String> list = Arrays.asList("Larry", "Moe", "Curly","Tom","QF_vince");
List<String> result = filter(list,(s)->s.contains("o"));
result.forEach(System.out::println);
}
private static List<String> filter(List<String> list,Predicate<String> p){
List<String> results = new ArrayList<>();
for (String s : list) {
if(p.test(s)){ //测试是否符合要求
results.add(s);
}
}
return results;
}
//Supplier 代表结果供应商
private static void supplierTest(){
List<Integer> list = getNums(10,()->(int)(Math.random() * 100));
list.forEach(System.out::println);
}
private static List<Integer> getNums(int num,Supplier<Integer> sup){
List<Integer> list = new ArrayList<>();
for(int i=0;i<num;i++){
list.add(sup.get());
}
return list;
}
//表示接受一个参数并产生结果的函数
private static void functionTest(){
String s = strToUpp("qf_vince",(str)->str.toUpperCase());
System.out.println(s);
}
public static String strToUpp(String str,Function<String,String> f){
return f.apply(str);
}
/**
* JDK1.8新的迭代方法
*/
private static void foreach(){
List<String> list = new ArrayList<>();
list.add("tom");
list.add("jack");
list.add("job");
list.add("lily");
//Consumer
list.forEach(s->System.out.println(s));
//list.forEach(System.out::println);
}
private static void enumeration(){
Vector<String> vs = new Vector<>();
vs.add("tom");
vs.add("jack");
vs.add("job");
vs.add("lily");
Enumeration<String> es = vs.elements();
while(es.hasMoreElements()){
System.out.println(es.nextElement());
}
}
//foreach(1.5后)
private static void foreach(Collection<Cat> c){
for(Cat cat: c){
System.out.println(cat);
}
}
//iterator(1.5之前统一的迭代集合方式)
private static void iterator(Collection<Cat> c){
Iterator<Cat> iter = c.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
public static void main(String[] args) {
List<Cat> list = new ArrayList<>();
Cat c1 = new Cat("miaomiao",5,1);
Cat c2 = new Cat("huahua",2,2);
Cat c3 = new Cat("tom",5,3);
Cat c4 = new Cat("miaomiao",3,1);
list.add(c1);
list.add(c2);
list.add(c3);
list.add(c4);
// iterator(list);
// foreach(list);
// enumeration();
// foreach();
// functionTest();
// supplierTest();
predicateTest();
}
}
Cat实体类从前面博客看 这里不再粘贴
Function接口
Supplier 代表结果供应商
获取10次随机数的结果
断言接口Predicate
表示用来做测试用的
Arrays类中的asList方法