目标:创建一个支持for-Each循环并随机获取数据的集合类
- for-each 是 Java 中的一种语法糖,for-Each循环主要是利用了类中的iterator,写法如下
// 语法糖写法
for (var text : asg){
System.out.println(text);
}
// 原理
for(Iterator<String> text = asg.iterator();text.hasNext();){
System.out.println(text.next());
}
思路:
- 创建一个类,继承Iterator接口
- 创建类的构造函数,传入需要随机获取的数据
- 实现Iterator的Iterator方法
- hasNext() 是否由下一个数据,返回boolean类型
- next() 返回下一个数据
package com.miracle.study;
import java.util.*;
/**
* @author Miracle
* @date 2021/4/1 13:46
*/
public class RandomStringGenerator<T> implements Iterable<T> {
/**
* 保存数据
*/
private final List<T> list;
/**
* 随机工具对象
*/
private final Random random = new Random();
public RandomStringGenerator(List<T> list){
this.list = list;
}
@Override
public Iterator<T> iterator(){
return new Iterator<T>() {
@Override
public boolean hasNext() {
// 这里可加入判断条件,不然会一直循环
return true;
}
@Override
public T next() {
// 随机返回存储集合的数据
return list.get(random.nextInt(list.size()));
}
};
}
public static void main(String[] args) {
var list = Arrays.asList("test1","test2","test3");
var asg = new RandomStringGenerator<String>(list);
for (var text : asg){
System.out.println(text);
}
// var asgIterable = asg.iterator();
// for (int i = 0; i < 100; i++){
// System.out.println(asgIterable.next());
// }
}
}
参考:https://blog.csdn.net/qq_43203949/article/details/105713145