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
	}


}


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值