您的位置:首页 > 编程语言 > Java开发

疯狂Java系列之集合和iterator接口

2017-06-12 15:24 260 查看

     使用集合就不可避免的会对集合中的元素进行遍历,

1、使用Lambda表达式遍历集合

Java8新增了一个forEach(Consumer
action
方法给迭代接口,该方法所需参数的类型是一个函数式接口,而Iterator接口是Collection接口的父接口,则Collection集合也能够调用这个方法。
代码:

package javaCollection;

import java.util.Collection;
import java.util.HashSet;
/**
* 使用Lambd表达式遍历集合
* @author bobo
*
*/
public class CollectionEach {

public static void main(String[] args) {
Collection person = new HashSet();
person.add("唐三藏");
person.add("孙悟空");
person.add("猪八戒");
person.add("沙悟净");
person.add("白龙马");

person.forEach(obj->System.out.println("迭代集合元素"+obj));
}
}


结果:



    总结:Lambda表达式的目标类型是Comsumer,forEach()方法会自动将集合元素逐个传给Lambda表达式的形参,这样Lambda表达式的代码体即可遍历到集合元素了。

2、Iterator遍历集合元素

Iterator主要用于遍历Collection集合元素(迭代访问),Iterator也被称为迭代器。
代码:
package javaCollection;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

public class Iteratortest {

public static void main(String[] args){
//创建添加元素
Collection person = new HashSet();
person.add("唐三藏");
person.add("孙悟空");
person.add("猪八戒");
person.add("沙悟净");
person.add("白龙马");

//获取person集合对应的迭代器
Iterator it=person.iterator();
while(it.hasNext())//如果集合元素没有被遍历完,则返回true继续遍历
{
//it.next()方法返回类型为Object,因此要强转
String ps=(String)it.next();
System.out.println(ps);
if(ps.equals("白龙马"))
{
//从集合中删除上一次next()方法返回的元素
it.remove();
}
//对ps变量赋值,不会改变集合元素本身
ps="测试字符串";
}
System.out.println(person);

}
}


结果:



总结:Iterator仅用于遍历集合,不能用来装对象,这里创建Iterator对象,则必须有一个被迭代的集合。
赋给ps的“测试”数据,并没有被输出,则说明当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量并不会对集合产生影响。

3、使用Lambda表达式遍历Iterator

迭代器接口共定义了四个方法:hashNext()、next()、remove()、forEachRemaining(action)。
forEachRemaining(Consumer action)方法是Java8新增的Iterator方法,该方法所需的Consumer参数也是函数式接口。当程序调用Iterator的FER()方法遍历集合元素时,程序依次将元素传给Consumer的accept(T
t)方法。
代码:
package javaCollection;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/**
* 使用Lambda表达式遍历Iterator
* @author bobo
*
*/
public class IteratorEach {

public static void main(String[] args) {
//创建添加元素
Collection person = new HashSet();
person.add("唐三藏");
person.add("孙悟空");
person.add("猪八戒");
person.add("沙悟净");
person.add("白龙马");

//获取person集合对应的迭代器
Iterator it=person.iterator();

//使用lambda表达式来遍历集合元素,(目标类型Comsumer obj)
it.forEachRemaining(obj->System.out.println("迭代集合元素:"+obj));
}

}


结果:



总结:将类型为Comsumer的传给forEachRemaining为参数,进行遍历和使用hashNext()Next方法一样,都可以进行集合元素遍历。

4、使用Foreach循环遍历集合元素
除以上遍历方法,java也提供了原生的遍历手段,使用foreach循环迭代访问集合元素。
与iterator接口迭代访问集合元素类似的是,foreach循环也不是传的集合元素本身,而是元素的值,所以在foreach循环中修改迭代变量也是无意义的。
代码:
package javaCollection;

import java.util.Collection;
import java.util.HashSet;

/**
* 使用Foreach循环遍历集合元素
* @author bobo
*
*/
public class forEachTest {

public static void main(String[] args) {
//创建添加元素
Collection person = new HashSet();
person.add("唐三藏");
person.add("白龙马");
person.add("沙悟净");

person.add("孙悟空");
person.add("猪八戒");

for(Object obj:person)
{
//此处的ps变量不是集合元素本身,Object类型元素需要强转
String ps=(String)obj;
System.out.println(ps);
// if(ps.equals("白龙马"))
// {
// //会引发concurrentModificationException异常
// person.remove(ps);
// }
}
System.out.println(person);
}

}


结果:



foreach循环迭代访问集合元素时,不能改变集合元素的值,否则引发异常。



以上介绍几种一次访问集合每一个元素的方法。希望对于迭代和集合有更深入的研究。

Java8新增了一个forEach(Consumer
action)方法给迭代接口,该方法所需参数的类型是一个函数式接口,而Iterator接口是Collection接口的父接口,则Collection集合也能够调用这个方法。
代码:

package javaCollection;

import java.util.Collection;
import java.util.HashSet;
/**
* 使用Lambd表达式遍历集合
* @author bobo
*
*/
public class CollectionEach {

public static void main(String[] args) {
Collection person = new HashSet();
person.add("唐三藏");
person.add("孙悟空");
person.add("猪八戒");
person.add("沙悟净");
person.add("白龙马");

person.forEach(obj->System.out.println("迭代集合元素"+obj));
}
}


结果:



    总结:Lambda表达式的目标类型是Comsumer,forEach()方法会自动将集合元素逐个传给Lambda表达式的形参,这样Lambda表达式的代码体即可遍历到集合元素了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐