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

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

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



Java8新增了一个forEachConsumer 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));
	}
}

结果:

疯狂Java系列之集合和iterator接口_第1张图片

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



2Iterator遍历集合元素

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);
		
	}
}


结果:

疯狂Java系列之集合和iterator接口_第2张图片

总结:Iterator仅用于遍历集合,不能用来装对象,这里创建Iterator对象,则必须有一个被迭代的集合。

赋给ps的“测试”数据,并没有被输出,则说明当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量并不会对集合产生影响。




3、使用Lambda表达式遍历Iterator

迭代器接口共定义了四个方法:hashNext()、next()、remove()、forEachRemainingaction)。

forEachRemaining(Consumer action)方法是Java8新增的Iterator方法,该方法所需的Consumer参数也是函数式接口。当程序调用IteratorFER()方法遍历集合元素时,程序依次将元素传给ConsumeracceptT 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));
	}

}


结果:

疯狂Java系列之集合和iterator接口_第3张图片

总结:将类型为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);
	}

}


结果:

疯狂Java系列之集合和iterator接口_第4张图片

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


疯狂Java系列之集合和iterator接口_第5张图片


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


Java8新增了一个forEachConsumer 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));
	}
}

结果:

疯狂Java系列之集合和iterator接口_第6张图片

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


你可能感兴趣的:(Java)