java Foreach与迭代器
2023-09-27 14:23:51 时间
foreach语法主要用于数组,但是它也可以用于Collection对象,下面是一个示例
package object; //: holding/ForEachCollections.java // All collections work with foreach. import java.util.*; public class ForEachCollections { public static void main(String[] args) { Collection<String> cs = new LinkedList<String>(); Collections.addAll(cs, "Take the long way home".split(" ")); for(String s : cs) System.out.print("'" + s + "' "); } } /* Output: 'Take' 'the' 'long' 'way' 'home' *///:~
cs是一个Colllection,所以这段代码展示了能够与foreach一起工作是所有Collection对象的特性
之所以能够工作,是因为Iterable接口,该接口包含了一个能够产生Iterator的iterator()方法,并且Iterator接口被foreach用来在序列中移动,因此如果你创建了任何实现了Iterable的类,都可以用于foreach语句中:
package object; //: holding/IterableClass.java // Anything Iterable works with foreach. import java.util.*; public class IterableClass implements Iterable<String> { protected String[] words = ("And that is how " + "we know the Earth to be banana-shaped.").split(" "); public Iterator<String> iterator() {//返回匿名内部类Iterator<String>的实例,该匿名内部类可以遍历数组中的所以单词 return new Iterator<String>() { private int index = 0; public boolean hasNext() { return index < words.length; } public String next() { return words[index++]; } public void remove() { // Not implemented throw new UnsupportedOperationException(); } }; } public static void main(String[] args) { for(String s : new IterableClass())(foreach语句调用了Iterator的方法 System.out.print(s + " "); } } /* Output: And that is how we know the Earth to be banana-shaped. *///:~
在java中,大量的类都是Iterable类型,主要包括Collection类(但不包括各种Map),例如下面的代码可以显示所有的操作系统的环境变量:
package object; //: holding/EnvironmentVariables.java import java.util.*; public class EnvironmentVariables { public static void main(String[] args) { for(Map.Entry entry: System.getenv().entrySet()) {//System.getenv()返回一个Map,entrySet()产生一个
//Map.Entry的元素构成的Set,并且这个Set是一个Iterable,因此它可以用于foreach循环 System.out.println(entry.getKey() + ": " + entry.getValue()); } } } /* (Execute to see output) *///:~
foreach可以用于数组和其他任何Iterable,但这不意味着数组肯定也是Iterable,而任何自动包装也不会自动发生,下面示例展示了当尝试将数组当作Iterable参数传递时会导致失败,这说明不存在任何从数组到Iterable的自动转化,必须手工执行这种转换
package object; //: holding/ArrayIsNotIterable.java import java.util.*; public class ArrayIsNotIterable { static <T> void test(Iterable<T> ib) { for(T t : ib) System.out.print(t + " "); } public static void main(String[] args) { test(Arrays.asList(1, 2, 3)); String[] strings = { "A", "B", "C" }; // An array works in foreach, but it's not Iterable: //! test(strings); // You must explicitly convert it to an Iterable: test(Arrays.asList(strings)); //test(strings); } } /* Output: 1 2 3 A B C *///:~
相关文章
- Java描述设计模式(13):迭代器模式
- Java官方文档
- 谈一谈Java 中 1000==1000 为false,而100==100 为true?
- [转载]Java迭代器(iterator详解以及和for循环的区别)
- 在 Ubuntu 20.04 上设置默认 Java 版本
- 普联软件Java笔试题
- Java迭代器Iterator的remove()方法
- 【Java】Java 序列化的高级认识
- Java面向对象中的异常
- 【Java实习生】每日10道面试题打卡!
- Windows下IDEA run能运行springboot,java -jar maven打的包拉有中文的nacos配置,报org.yaml.snakeyaml.error.YAMLException错误解决
- Java界面设计之页面管理器
- Java集合基础知识笔记:List集合(为什么需编写equals方法)、Map集合(equals与hashCode方法)、EnumMap好处、有顺序的TreeMap、读写配置文件Properties、Set集合(不重复的key值)与有顺序的Set、队列、优先队列、双端队列、栈、迭代器
- Java基础篇:Iterator迭代器
- java多线程
- Java版的QQ小程序
- 对JAVA集合进行遍历删除时务必要用迭代器
- Java笔记20:迭代器模式