java篇 常用工具类 0x03:Iterator 与 Iterable 接口

2024-08-31 06:04

本文主要是介绍java篇 常用工具类 0x03:Iterator 与 Iterable 接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • Iterator 接口
    • Iterable 接口
      • 手动实现 Iterable 接口示例

Iterator 接口

Iterator 接口在 java.util 包中。实现了 Iterator 接口的类就可以支持遍历操作。

public interface Iterator<E> {// 只需要关注到这两个抽象方法boolean hasNext();     // 还有没有下一个元素E next();              // 返回下一个元素
}

Iterable 接口

Iterable 接口在 java.lang 包中。实现了 Iterable 接口的类就可以支持 forEach 循环。

import java.util.Iterator;public interface Iterable<T> {// 只需要关注这个抽象方法Iterator<T> iterator();    // 得到一个迭代器
}

手动实现 Iterable 接口示例

不实现 Iterable 接口时:

// 不实现 Iterable 接口
// 容器类
public class MyElementList  {  private Object[] elements;  private int curr;  //    @Override  
//    public Iterator iterator() {  
//        return new Iterator() {         // 由于 Iterator 是接口,不能直接 new 实例,所以用一个匿名类来实现实例的创建  
//  
//            int pointer = 0;  
//  
//            @Override  
//            public boolean hasNext() {  
//                return pointer < size();  
//            }  
//  
//            @Override  
//            public Object next() {  
//                return elements[pointer++];  
//            }  
//        };  
//    }  public int size() {  return curr;  }  public MyElementList() {  elements = new Object[16];  curr = 0;  }  public void add(Object o) {  if (curr < elements.length - 1) {  elements[curr] = o;  curr++;  } else {  System.out.println("Out of bound.");  }  }  }// 调用类
public class TestUse {  public static void main(String[] args) {  MyElementList list = new MyElementList();  System.out.println(list.size());        // 0  list.add("abc");  list.add(123);  System.out.println(list.size());        // 2  for (Object o : list){  System.out.println(o);  }  /* 报错  java: for-each 不适用于表达式类型  要求: 数组或 java.lang.Iterable          找到:    iter.MyElementList  */   /*若 MyElementList 里的 elements 是 public 的,倒是可以:for (Object o : list.elements){  System.out.println(o);  } 但现在 elements 也是 private 的。*/}  
}// 可见是不支持 forEach 循环

实现 Iterable 接口时:

// 实现 Iterable 接口
// 容器类
import java.util.Iterator;  public class MyElementList implements Iterable {  private Object[] elements;  private int curr;  @Override  public Iterator iterator() {  return new Iterator() {         // 由于 Iterator 是接口,不能直接 new 实例,所以用一个匿名类来实现实例的创建  int pointer = 0;  @Override  public boolean hasNext() {  return pointer < size();  }  @Override  public Object next() {  return elements[pointer++];  }  };  }  public int size() {  return curr;  }  public MyElementList() {  elements = new Object[16];  curr = 0;  }  public void add(Object o) {  if (curr < elements.length - 1) {  elements[curr] = o;  curr++;  } else {  System.out.println("Out of bound.");  }  }  }// 调用类
public class TestUse {  public static void main(String[] args) {  MyElementList list = new MyElementList();  System.out.println(list.size());        // 0  list.add("abc");  list.add(123);  System.out.println(list.size());        // 2  for (Object o : list){  System.out.println(o);  }  }
}
// 输出结果:
/*
0
2
abc
123Process finished with exit code 0
*/// 可见,实现了 Iterable 接口之后,就支持 forEach 循环了。

注意:是实现了 Iterable 接口的类,支持 forEach,而并非是实现了 Iterator 接口的类支持 forEach。

// 实现的若是 Iterator 接口而非 Iterable 接口
// 容器类
import java.util.Iterator;  public class MyElementList implements Iterator {  private Object[] elements;  private int curr;  //    @Override  
//    public Iterator<T> iterator() {  
//        return new Iterator<T>() {         // 由于 Iterator 是接口,不能直接 new 实例,所以用一个匿名类来实现实例的创建  
//  
//            int pointer = 0;  
//  
//            @Override  
//            public boolean hasNext() {  
//                return pointer < size();  
//            }  
//  
//            @Override  
//            public T next() {  
//                return (T)elements[pointer++];  
//            }  
//        };  
//    }  public int size() {  return curr;  }  public MyElementList() {  elements = new Object[16];  curr = 0;  }  public void add(Object o) {  if (curr < elements.length - 1) {  elements[curr] = o;  curr++;  } else {  System.out.println("Out of bound.");  }  }  // 使用类似的代码int pointer = 0;  @Override  public boolean hasNext() {  return pointer < size();  }  @Override  public Object next() {  return elements[pointer++];  }  
}// 调用类
public class TestUse {  public static void main(String[] args) {  MyElementList list = new MyElementList();  System.out.println(list.size());        // 0  list.add("abc");  list.add(123);  System.out.println(list.size());        // 2  System.out.println(list.next());        // abc  System.out.println(list.next());        // 123  System.out.println(list.next());        // null  for (Object o : list){           System.out.println(o);  }  /* 报错  java: for-each 不适用于表达式类型  要求: 数组或 java.lang.Iterable          找到:    iter.MyElementList  */        // 这也不是因为之前执行过多次 .next(),把上面的 .next() 语句全部注释,还是同样的报错}  
}// 可见,实现 Iterator 接口,并不能让类支持 forEach 循环。

这其实很好理解,实现 Iterator 并不会获得一个生成器(而是自己变成了一个生成器),而实现 Iteralbe 会获得一个生成器。

那么是否可以不实现 Iterable,而直接通过导入 Iterator 类然后 new 一个 Iterator 实例返回一个生成器来实现支持 forEach 呢?

其实只需要保留一开始的代码,然后把 implents Iterable 去掉测试一下即可。

import java.util.Iterator;  public class MyElementList  {  private Object[] elements;  private int curr;  //	@Overridepublic Iterator iterator() {  return new Iterator() {         // 由于 Iterator 是接口,不能直接 new 实例,所以用一个匿名类来实现实例的创建  int pointer = 0;  @Override  public boolean hasNext() {  return pointer < size();  }  @Override  public Object next() {  return elements[pointer++];  }  };  }  public int size() {  return curr;  }  public MyElementList() {  elements = new Object[16];  curr = 0;  }  public void add(Object o) {  if (curr < elements.length - 1) {  elements[curr] = o;  curr++;  } else {  System.out.println("Out of bound.");  }  }  }// 调用类
public class TestUse {  public static void main(String[] args) {  MyElementList list = new MyElementList();  System.out.println(list.size());        // 0  list.add("abc");  list.add(123);  System.out.println(list.size());        // 2  for (Object o : list){  System.out.println(o);  }  /*  报错:  java: for-each 不适用于表达式类型  要求: 数组或 java.lang.Iterable          找到:    iter.MyElementList  */    }  
}// 可见,还是不行,因此就是要实现 Iterable 接口,才能让该类支持 forEach 循环。

这篇关于java篇 常用工具类 0x03:Iterator 与 Iterable 接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123090

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J