Java8中新增加的集合类

Java学习 专栏收录该内容
128 篇文章 1 订阅
 
 前言
 在平常的开发中,有时我们需要存放多个数据,因此也就有了集合的存在,这篇博客着重讲解一下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
    点赞
  • 6
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
程序员必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020年中国开发者调查报告》显示,超83%开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺技能!   套餐中一共包含2门MySQL数据库必学核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识人;  2)对MySQL掌握程度薄弱人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底问题问到怀疑人生应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL最佳性能优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作中代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料打包下载。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值