集合(1)

1、概述

    数组元素既可以是基本数据类型,也可以是对象引用,集合中元素只能是对象引用,集合类位于java.util包下,java.util.concurrent包下为多线程支持的集合类。java集合主要包含List、Set、Queue、Map四种体系。

    Set、List、Queue是由Collection接口派生而来的子接口,Collection包含add()、remove()、size()等方法。List、Set、Queue又派生出了ArrayList、ArrayDeque、LinkedList、HashSet、TreeSet等实现类。HashMap、TreeMap等实现类的父接口是Map,它包含put()、remove()、size()等方法。可以使用foreach循环遍历集合元素。

    Collection的方法removeIf()可以删除符合指定条件的元素,其参数是一个Predicate类型的函数式接口,可以传入一个Lambda表达式给它。Predicate是一个比较常用的谓词对象,它包含的抽象函数为boolean  test(T t),重写它来实现条件判断逻辑。

    Collection的父接口Iterable中有一个默认方法forEach(Consumer action),可以调用它来遍历集合。forEach()的参数是Consumer类型,它是一个函数式接口类型,包含的虚函数为void accept(T t)。当使用forEach()遍历集合元素时,会将元素传给accept()方法。因此可以给forEach传入Lambda表达式,在该表达式中对元素进行访问处理。

    Iterator接口主要用来实现迭代器,也可以使用它来遍历集合。Iterator有一个remove()方法,它删除上次next()获得的集合元素,而且它可以在迭代遍历集合中使用,如果在迭代过程中通过容器的remove()方法删除元素则会引发java.util.ConcurrentModificationException异常。Iterator采用“快速失败”机制,一旦在迭代过程中检测到集合被其它线程修改会立即引发ConcurrentModificationException异常。

    迭代器有一个forEachRemaining()方法,它类似于容器的forEach方法,可以配合一个Lambda表达式来遍历集合。

package xu;
import java.util.*; 

public class Test
{
	public static void main(String[] args)
	{	
		Collection c = new ArrayList();
		
		c.add("java");
		c.add("c#");
		c.add("c++");
		c.add(10); //对于基本数据类型会自动装箱
		
		System.out.println(c); //输出[c#, c++, java]
		
		boolean b = c.contains(10); //true
		if(b)
			c.remove(10);
		
		c.removeIf(item -> ((String)item).length() < 3); //删除长度小于3的元素
		
		String str = c.toString();
		System.out.println(c); //输出集合:[java, c++]
		
		//使用foreach循环遍历集合元素
		for(Object item : c)
		{
			String s = (String)item;
			System.out.println(s);
			
			//c.remove("c++"); //error:foreach循环中不能改变集合,否则会引发异常!
		}
	
		//使用Lambda表达式遍历集合
		c.forEach(item->System.out.println(item)); //输出集合中每个元素
		
		//使用迭代器遍历集合
		Iterator it = c.iterator();
		while(it.hasNext())
		{
			String s = (String)it.next(); //next()返回的是Object类型,所以需要强转
			System.out.println(s); //输出元素
			if(s == "c++")
				it.remove(); //在迭代循环中可以通过迭代器的remove来删除元素
		}
		
		//使用迭代器配合Lambda表达式遍历集合
		it = c.iterator();
		it.forEachRemaining(item->System.out.println(item));
	}
}

2、流式操作

    Stream、IntStream、LongStream、DoubleStream接口提供对集合的流式操作,使用Stream的流程为:调用builder()方法创建该Stream对应的Builder,调用Builder的add()方法添加元素,调用Builder的build()方法获取对应的Stream,调用Stream中聚集方法。对于很多聚集方法而言,调用该方法后就不能再使用该流,即不能调用Stream的其它方法,这些被称为末端方法,比如forEach()、max()、toArray()等。还有一些中间方法,它们的返回值是另外的流,可以对该流进行操作,如map()、filter()等。

package xu;  
import java.util.stream.*; 

public class Test
{
	public static void main(String[] args)
	{	
		IntStream is = IntStream.builder().add(10).add(13).add(-1).build();
		
		//以下方法只能调用一个,否则会引发异常
		//is.forEach(System.out::println);
		//long count = is.count();
		//int max = is.max().getAsInt();
		//int sum = is.sum();
		//double average = is.average().getAsDouble();
		//is.anyMatch(item->item * item > 100); //是否有一个元素大于100
		//is.allMatch(item->item * item > 100); //所有元素的平方是否都大于100
		
		IntStream newIs = is.map(item->item * 2); //将is映射成一个新的Stream,新的Stream中每个元素值是原Stream的两倍
		newIs.forEach(System.out::println);
		//IntStream newIs = is.filter(item->item >= 0); //生成新的Stream,其中去除小于0的元素
		//newIs.forEach(System.out::println);
		
		String str = Stream.of("A", "is", "a", "dog").reduce("", (s1, s2)->s1 + s2); //静态方法of可以获得一个Stream,reduce方法通过指定的操作来合并元素
		System.out.println(str); //输出为"Aisadog"
	}
}

    Collection提供了一个stream()默认方法,它可以返回该集合对应的Stream流,然后可以通过流中聚集方法来操作集合元素:

package xu;  
import java.util.*;   
import java.util.stream.*;  
  
public class Test  
{  
    public static void main(String[] args)  
    {        
        Collection books = new HashSet();  
        books.add(new String("java编程"));  
        books.add(new String("java测试"));  
        books.add(new String("c++编程"));  
        books.add(new String("c++测试"));  
          
        System.out.println(books.stream().filter(item->((String)item).contains("java")).count()); //输出books中包含java的字符串的个数  
        IntStream is = books.stream().mapToInt(item->((String)item).length());  
        is.forEach(System.out::println); //输出为6、6、5、5  
    }  
}


猜你喜欢

转载自blog.csdn.net/milanleon/article/details/80733811