容器 迭代器源码解析
标签(空格分隔): 容器 Iterable Iterator
demo
List<String> list = new ArrayList<>();
Iterator<String> iterable = list.iterator();
while (iterable.hasNext()) {
String data = iterable.next();
}
code
public interface Iterable<T> {
//迭代器
Iterator<T> iterator();
//遍历元素,
default void forEach(Consumer<? super T> action) {
//空检查
Objects.requireNonNull(action);
//这里要注意一下:foreach增强for循环出自于java5,且遍历的数据源只能是Iterable或者Array数组
for (T t : this) {
//遍历回调
action.accept(t);
}
}
//不知道是干啥的,先放放
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
public interface Iterator<E> {
//判断是否还有下一个元素
boolean hasNext();
//获取下一个元素
E next();
//移除当前元素
default void remove() {
throw new UnsupportedOperationException("remove");
}
//回调所有的元素
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
public interface Consumer<T> {
//接口方法
void accept(T t);
//先调用accept,然后回调传入的accept
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
迭代器在这里只能看到接口,具体还是需要在实现类中
容器Collection实现了Iterable接口;里面方法还挺多
public interface Collection<E> extends Iterable<E> {
//容器尺寸
int size();
//容器是否为空
boolean isEmpty();
//容器中是否包含指定对象
boolean contains(Object o);
//迭代器 Iterable中不是有该方法吗,怎么又写一遍 ???
Iterator<E> iterator();
//将容器转化为数组
Object[] toArray();
//数组->数组 ???
<T> T[] toArray(T[] a);
//添加一个元素
boolean add(E e);
//移除一个元素
boolean remove(Object o);
//当前容器是否包含指定容器中的元素
boolean containsAll(Collection<?> c);
//将指定容器中的元素是否当前容器中都包含有
boolean addAll(Collection<? extends E> c);
//移除当前容器中包含的 指定容器中的所有元素
boolean removeAll(Collection<?> c);
//标记是否移除 ???
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
//两个容器的交集
//如果存在相同元素,当前容器中仅保留相同的元素。如果不存在相同元素,当前容器中会变为空
boolean retainAll(Collection<?> c);
//清除当前容器中的元素
void clear();
//容器中的内容是否相等
boolean equals(Object o);
//当前容器的hashCode
int hashCode();
//后面新增的方法不太懂
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}