1. 程式人生 > >Java8中新增加的集合類

Java8中新增加的集合類

 
 前言
 在平常的開發中,有時我們需要存放多個數據,因此也就有了集合的存在,這篇部落格著重講解一下java8給我們帶來的一些類關於Collection的操作。


 Collection介面

  正如上圖所示,Collection介面位於最底層介面,為所有的集合操作提供了一些公共的方法。比如add、addAll、clear、contains、toArray等方法

 
/**     
 * @FileName: CollectionTest.java   
 * @Package:com.collection   
 * @Description: TODO  
 * @author: LUCKY    
 * @date:2015年12月2日 上午11:32:48   
 * @version V1.0     
 */
package com.collection;


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


/**  
 * @ClassName: CollectionTest   
 * @Description: TODO  
 * @author: LUCKY  
 * @date:2015年12月2日 上午11:32:48     
 */
public class CollectionTest {


	public static void main(String[] args) {
		Collection c=new ArrayList();
		//新增元素
		c.add("孫悟空");
		//雖然集合裡不能放置基本型別的值,但java支援自動裝箱操作
		c.add(6);
		System.out.println("集合中的元素個數為"+c.size());
		//刪除指定的元素
		c.remove(6);
		System.out.println("集合中是否包含\"孫悟空\"字串"+c.contains("孫悟空"));
		Collection books=new HashSet();
		books.add("輕量級java EE企業應用實戰");
		books.add("瘋狂java講義");
		System.out.println("c集合是否完全包含books集合"+c.containsAll(books));
		//刪除c集合中的所有元素
		c.clear();
		//控制books集合裡只剩下c集合裡也包含的元素
		
		books.retainAll(c);
		System.out.println("books集合的元素"+books);
	}
}


 那麼在java8中為我們增加了那些好的遍歷集合的操作?

 1.Lambda表示式
 在java8中新增加了一個forEach方法,可以使用Lambda表示式來遍歷集合元素
 
/**     
 * @FileName: CollectionEach.java   
 * @Package:com.collection   
 * @Description: TODO  
 * @author: LUCKY    
 * @date:2015年12月2日 上午11:40:20   
 * @version V1.0     
 */
package com.collection;


import java.util.Collection;
import java.util.HashSet;
import java.util.function.Consumer;


/**  
 * @ClassName: CollectionEach   
 * @Description: TODO  
 * @author: LUCKY  
 * @date:2015年12月2日 上午11:40:20     
 */
public class CollectionEach {


	public static void main(String[] args) {
		//建立一個集合
		Collection books=new HashSet();
		books.add("輕量級java EE 企業應用實戰");
		books.add("瘋狂java講義");
		books.add("瘋狂android講義");
		//呼叫foreach方法迴圈遍歷集合
		books.forEach(obj->System.out.println("迭代元素:"+obj));
	}
}



 2.使用Lambda遍歷Iterator

 java8中為Iterator增加了一個forEachRemaining方法,,也可以使用Lambda來遍歷

/**     
 * @FileName: IteratorEach.java   
 * @Package:com.collection   
 * @Description: TODO  
 * @author: LUCKY    
 * @date:2015年12月2日 下午12:01:20   
 * @version V1.0     
 */
package com.collection;


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


/**  
 * @ClassName: IteratorEach   
 * @Description: TODO  
 * @author: LUCKY  
 * @date:2015年12月2日 下午12:01:20     
 */
public class IteratorEach {


	public static void main(String[] args) {
		Collection books=new HashSet();
		books.add("輕量級java EE 企業應用實戰");
		books.add("瘋狂java講義");
		books.add("瘋狂android講義");
		//獲取books集合對應的迭代器
		Iterator it=books.iterator();
		//使用lambda表示式(目標型別是Comsumer)來遍歷集合元素
		it.forEachRemaining(obj ->System.out.println("輸出的結果是"+obj));
	}
}

3.java8中增加的Predicate操作集合

 在java8中為Collection集合增加了一個removeIF方法,也可以用來操作lambda

 
package com.collection;
import java.util.*;
import java.util.function.*;
public class PredicateTest2
{
	public static void main(String[] args)
	{
		// 建立books集合、為books集合新增元素的程式碼與前一個程式相同。
		Collection books = new HashSet();
		books.add(new String("輕量級Java EE企業應用實戰"));
		books.add(new String("瘋狂Java講義"));
		books.add(new String("瘋狂iOS講義"));
		books.add(new String("瘋狂Ajax講義"));
		books.add(new String("瘋狂Android講義"));
		// 統計書名包含“瘋狂”子串的圖書數量
		System.out.println(calAll(books, obj->((String)obj).contains("瘋狂")));
		System.out.println(calAll(books , ele->((String)ele).contains("瘋狂")));
		// 統計書名包含“Java”子串的圖書數量
		System.out.println(calAll(books , ele->((String)ele).contains("Java")));
		// 統計書名字串長度大於10的圖書數量
		System.out.println(calAll(books , ele->((String)ele).length() > 10));
	}
	public static int calAll(Collection books , Predicate p)
	{
		int total = 0;
		for (Object obj : books)
		{
			// 使用Predicate的test()方法判斷該物件是否滿足Predicate指定的條件
			if (p.test(obj))
			{
				total ++;
			}
		}
		return total;
	}
}


 4.Stream操作集合

 在java8中還增加了Stream、intStream、LongStream、DoubleStream等流式API,並且java8中還為每個API提供了對應的Builder,例如StreamBuilder、IntStreamBuilder等

/**     
 * @FileName: IntStreamTest.java   
 * @Package:com.collection   
 * @Description: TODO  
 * @author: LUCKY    
 * @date:2015年12月2日 下午2:20:14   
 * @version V1.0     
 */
package com.collection;


import java.util.stream.IntStream;


public class IntStreamTest {


	public static void main(String[] args) {
		IntStream is = IntStream.builder()
				.add(20)
				.add(13)
				.add(-2)
				.add(18)
				.build();
			// 下面呼叫聚集方法的程式碼每次只能執行一個
//			System.out.println("is所有元素的最大值:" + is.max().getAsInt());
			is.filter(ele->ele>0).forEach(System.out::println);
//			System.out.println("-------------");
//			is.forEach(System.out::println); // 輸出41 27 -3 37
//			System.out.println("is所有元素的最小值:" + is.min().getAsInt());
//			System.out.println("is所有元素的總和:" + is.sum());
//			System.out.println("is所有元素的總數:" + is.count());
//			System.out.println("is所有元素的平均值:" + is.average());
//			System.out.println("is所有元素的平方是否都大於20:"
//				+ is.allMatch(ele -> ele * ele > 20));
//			System.out.println("is是否包含任何元素的平方大於20:"
//				+ is.anyMatch(ele -> ele * ele > 20));
			// 將is對映成一個新Stream,新Stream的每個元素是原Stream元素的2倍+1
//			IntStream newIs = is.map(ele -> ele * 2 + 1);
			// 使用方法引用的方式來遍歷集合元素
//			newIs.forEach(System.out::println); // 輸出41 27 -3 37


	}
}

 5.Collection操作集合

 在java8中還為Collection提供了stream()預設方法,改方法用來返回該集合對應的流

 
/**     
 * @FileName: CollectionStream.java   
 * @Package:com.collection   
 * @Description: TODO  
 * @author: LUCKY    
 * @date:2015年12月2日 下午2:33:05   
 * @version V1.0     
 */
package com.collection;


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


/**
 * @ClassName: CollectionStream
 * @Description: TODO
 * @author: LUCKY
 * @date:2015年12月2日 下午2:33:05
 */
public class CollectionStream {


	public static void main(String[] args) {
		// 建立books集合、為books集合新增元素的程式碼與8.2.5小節的程式相同。
		Collection books = new HashSet();
		books.add(new String("輕量級Java EE企業應用實戰"));
		books.add(new String("瘋狂Java講義"));
		books.add(new String("瘋狂iOS講義"));
		books.add(new String("瘋狂Ajax講義"));
		books.add(new String("瘋狂Android講義"));
		// 統計書名包含“瘋狂”子串的圖書數量
		System.out.println(books.stream()
				.filter(ele -> ((String) ele).contains("瘋狂")).count()); // 輸出4
		// 統計書名包含“Java”子串的圖書數量
		System.out.println(books.stream()
				.filter(ele -> ((String) ele).contains("Java")).count()); // 輸出2
		// 統計書名字串長度大於10的圖書數量
		System.out.println(books.stream()
				.filter(ele -> ((String) ele).length() > 10).count()); // 輸出2
		// 先呼叫Collection物件的stream()方法將集合轉換為Stream,
		// 再呼叫Stream的mapToInt()方法獲取原有的Stream對應的IntStream
	
		books.stream().mapToInt(ele -> ((String) ele).length())
		// 呼叫forEach()方法遍歷IntStream中每個元素
				.forEach(System.out::println);// 輸出8 11 16 7 8
	}


}