Java8中新增加的集合类

来源:互联网 发布:淘宝卖什么最好 编辑:程序博客网 时间:2024/05/21 12:09
前言
 在平常的开发中,有时我们需要存放多个数据,因此也就有了集合的存在,这篇博客着重讲解一下java8给我们带来的一些类关于Collection的操作。


 Collection接口

  正如上图所示,Collection接口位于最底层接口,为所有的集合操作提供了一些公共的方法。比如add、addAll、clear、contains、toArray等方法

[java] view plaincopyprint?
  1.    
  2. /**      
  3.  * @FileName: CollectionTest.java    
  4.  * @Package:com.collection    
  5.  * @Description: TODO   
  6.  * @author: LUCKY     
  7.  * @date:2015年12月2日 上午11:32:48    
  8.  * @version V1.0      
  9.  */  
  10. package com.collection;  
  11.   
  12.   
  13. import java.util.ArrayList;  
  14. import java.util.Collection;  
  15. import java.util.HashSet;  
  16.   
  17.   
  18. /**   
  19.  * @ClassName: CollectionTest    
  20.  * @Description: TODO   
  21.  * @author: LUCKY   
  22.  * @date:2015年12月2日 上午11:32:48      
  23.  */  
  24. public class CollectionTest {  
  25.   
  26.   
  27.     public static void main(String[] args) {  
  28.         Collection c=new ArrayList();  
  29.         //添加元素  
  30.         c.add("孙悟空");  
  31.         //虽然集合里不能放置基本类型的值,但java支持自动装箱操作  
  32.         c.add(6);  
  33.         System.out.println("集合中的元素个数为"+c.size());  
  34.         //删除指定的元素  
  35.         c.remove(6);  
  36.         System.out.println("集合中是否包含\"孙悟空\"字符串"+c.contains("孙悟空"));  
  37.         Collection books=new HashSet();  
  38.         books.add("轻量级java EE企业应用实战");  
  39.         books.add("疯狂java讲义");  
  40.         System.out.println("c集合是否完全包含books集合"+c.containsAll(books));  
  41.         //删除c集合中的所有元素  
  42.         c.clear();  
  43.         //控制books集合里只剩下c集合里也包含的元素  
  44.           
  45.         books.retainAll(c);  
  46.         System.out.println("books集合的元素"+books);  
  47.     }  
  48. }  



 那么在java8中为我们增加了那些好的遍历集合的操作?


 1.Lambda表达式
 在java8中新增加了一个forEach方法,可以使用Lambda表达式来遍历集合元素
[java] view plaincopyprint?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">   
  2. /**      
  3.  * @FileName: CollectionEach.java    
  4.  * @Package:com.collection    
  5.  * @Description: TODO   
  6.  * @author: LUCKY     
  7.  * @date:2015年12月2日 上午11:40:20    
  8.  * @version V1.0      
  9.  */  
  10. package com.collection;  
  11.   
  12.   
  13. import java.util.Collection;  
  14. import java.util.HashSet;  
  15. import java.util.function.Consumer;  
  16.   
  17.   
  18. /**   
  19.  * @ClassName: CollectionEach    
  20.  * @Description: TODO   
  21.  * @author: LUCKY   
  22.  * @date:2015年12月2日 上午11:40:20      
  23.  */  
  24. public class CollectionEach {  
  25.   
  26.   
  27.     public static void main(String[] args) {  
  28.         //创建一个集合  
  29.         Collection books=new HashSet();  
  30.         books.add("轻量级java EE 企业应用实战");  
  31.         books.add("疯狂java讲义");  
  32.         books.add("疯狂android讲义");  
  33.         //调用foreach方法循环遍历集合  
  34.         books.forEach(obj->System.out.println("迭代元素:"+obj));  
  35.     }  
  36. }  
  37. </span>  



 2.使用Lambda遍历Iterator

 java8中为Iterator增加了一个forEachRemaining方法,,也可以使用Lambda来遍历

[java] view plaincopyprint?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">/**      
  2.  * @FileName: IteratorEach.java    
  3.  * @Package:com.collection    
  4.  * @Description: TODO   
  5.  * @author: LUCKY     
  6.  * @date:2015年12月2日 下午12:01:20    
  7.  * @version V1.0      
  8.  */  
  9. package com.collection;  
  10.   
  11.   
  12. import java.util.Collection;  
  13. import java.util.HashSet;  
  14. import java.util.Iterator;  
  15.   
  16.   
  17. /**   
  18.  * @ClassName: IteratorEach    
  19.  * @Description: TODO   
  20.  * @author: LUCKY   
  21.  * @date:2015年12月2日 下午12:01:20      
  22.  */  
  23. public class IteratorEach {  
  24.   
  25.   
  26.     public static void main(String[] args) {  
  27.         Collection books=new HashSet();  
  28.         books.add("轻量级java EE 企业应用实战");  
  29.         books.add("疯狂java讲义");  
  30.         books.add("疯狂android讲义");  
  31.         //获取books集合对应的迭代器  
  32.         Iterator it=books.iterator();  
  33.         //使用lambda表达式(目标类型是Comsumer)来遍历集合元素  
  34.         it.forEachRemaining(obj ->System.out.println("输出的结果是"+obj));  
  35.     }  
  36. }  
  37. </span>  



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

 在java8中为Collection集合增加了一个removeIF方法,也可以用来操作lambda

[java] view plaincopyprint?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">   
  2. package com.collection;  
  3. import java.util.*;  
  4. import java.util.function.*;  
  5. public class PredicateTest2  
  6. {  
  7.     public static void main(String[] args)  
  8.     {  
  9.         // 创建books集合、为books集合添加元素的代码与前一个程序相同。  
  10.         Collection books = new HashSet();  
  11.         books.add(new String("轻量级Java EE企业应用实战"));  
  12.         books.add(new String("疯狂Java讲义"));  
  13.         books.add(new String("疯狂iOS讲义"));  
  14.         books.add(new String("疯狂Ajax讲义"));  
  15.         books.add(new String("疯狂Android讲义"));  
  16.         // 统计书名包含“疯狂”子串的图书数量  
  17.         System.out.println(calAll(books, obj->((String)obj).contains("疯狂")));  
  18.         System.out.println(calAll(books , ele->((String)ele).contains("疯狂")));  
  19.         // 统计书名包含“Java”子串的图书数量  
  20.         System.out.println(calAll(books , ele->((String)ele).contains("Java")));  
  21.         // 统计书名字符串长度大于10的图书数量  
  22.         System.out.println(calAll(books , ele->((String)ele).length() > 10));  
  23.     }  
  24.     public static int calAll(Collection books , Predicate p)  
  25.     {  
  26.         int total = 0;  
  27.         for (Object obj : books)  
  28.         {  
  29.             // 使用Predicate的test()方法判断该对象是否满足Predicate指定的条件  
  30.             if (p.test(obj))  
  31.             {  
  32.                 total ++;  
  33.             }  
  34.         }  
  35.         return total;  
  36.     }  
  37. }  
  38. </span>  




 4.Stream操作集合

 在java8中还增加了Stream、intStream、LongStream、DoubleStream等流式API,并且java8中还为每个API提供了对应的Builder,例如StreamBuilder、IntStreamBuilder等

[java] view plaincopyprint?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">/**      
  2.  * @FileName: IntStreamTest.java    
  3.  * @Package:com.collection    
  4.  * @Description: TODO   
  5.  * @author: LUCKY     
  6.  * @date:2015年12月2日 下午2:20:14    
  7.  * @version V1.0      
  8.  */  
  9. package com.collection;  
  10.   
  11.   
  12. import java.util.stream.IntStream;  
  13.   
  14.   
  15. public class IntStreamTest {  
  16.   
  17.   
  18.     public static void main(String[] args) {  
  19.         IntStream is = IntStream.builder()  
  20.                 .add(20)  
  21.                 .add(13)  
  22.                 .add(-2)  
  23.                 .add(18)  
  24.                 .build();  
  25.             // 下面调用聚集方法的代码每次只能执行一个  
  26. //          System.out.println("is所有元素的最大值:" + is.max().getAsInt());  
  27.             is.filter(ele->ele>0).forEach(System.out::println);  
  28. //          System.out.println("-------------");  
  29. //          is.forEach(System.out::println); // 输出41 27 -3 37  
  30. //          System.out.println("is所有元素的最小值:" + is.min().getAsInt());  
  31. //          System.out.println("is所有元素的总和:" + is.sum());  
  32. //          System.out.println("is所有元素的总数:" + is.count());  
  33. //          System.out.println("is所有元素的平均值:" + is.average());  
  34. //          System.out.println("is所有元素的平方是否都大于20:"  
  35. //              + is.allMatch(ele -> ele * ele > 20));  
  36. //          System.out.println("is是否包含任何元素的平方大于20:"  
  37. //              + is.anyMatch(ele -> ele * ele > 20));  
  38.             // 将is映射成一个新Stream,新Stream的每个元素是原Stream元素的2倍+1  
  39. //          IntStream newIs = is.map(ele -> ele * 2 + 1);  
  40.             // 使用方法引用的方式来遍历集合元素  
  41. //          newIs.forEach(System.out::println); // 输出41 27 -3 37  
  42.   
  43.   
  44.     }  
  45. }  
  46. </span>  



 5.Collection操作集合

 在java8中还为Collection提供了stream()默认方法,改方法用来返回该集合对应的流

[java] view plaincopyprint?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">   
  2. /**      
  3.  * @FileName: CollectionStream.java    
  4.  * @Package:com.collection    
  5.  * @Description: TODO   
  6.  * @author: LUCKY     
  7.  * @date:2015年12月2日 下午2:33:05    
  8.  * @version V1.0      
  9.  */  
  10. package com.collection;  
  11.   
  12.   
  13. import java.util.Collection;  
  14. import java.util.HashSet;  
  15.   
  16.   
  17. /** 
  18.  * @ClassName: CollectionStream 
  19.  * @Description: TODO 
  20.  * @author: LUCKY 
  21.  * @date:2015年12月2日 下午2:33:05 
  22.  */  
  23. public class CollectionStream {  
  24.   
  25.   
  26.     public static void main(String[] args) {  
  27.         // 创建books集合、为books集合添加元素的代码与8.2.5小节的程序相同。  
  28.         Collection books = new HashSet();  
  29.         books.add(new String("轻量级Java EE企业应用实战"));  
  30.         books.add(new String("疯狂Java讲义"));  
  31.         books.add(new String("疯狂iOS讲义"));  
  32.         books.add(new String("疯狂Ajax讲义"));  
  33.         books.add(new String("疯狂Android讲义"));  
  34.         // 统计书名包含“疯狂”子串的图书数量  
  35.         System.out.println(books.stream()  
  36.                 .filter(ele -> ((String) ele).contains("疯狂")).count()); // 输出4  
  37.         // 统计书名包含“Java”子串的图书数量  
  38.         System.out.println(books.stream()  
  39.                 .filter(ele -> ((String) ele).contains("Java")).count()); // 输出2  
  40.         // 统计书名字符串长度大于10的图书数量  
  41.         System.out.println(books.stream()  
  42.                 .filter(ele -> ((String) ele).length() > 10).count()); // 输出2  
  43.         // 先调用Collection对象的stream()方法将集合转换为Stream,  
  44.         // 再调用Stream的mapToInt()方法获取原有的Stream对应的IntStream  
  45.       
  46.         books.stream().mapToInt(ele -> ((String) ele).length())  
  47.         // 调用forEach()方法遍历IntStream中每个元素  
  48.                 .forEach(System.out::println);// 输出8 11 16 7 8  
  49.     }  
  50.   
  51.   
  52. }</span>  
  53. 原文地址:点击打开链接
0 0