前言
在平常的开发中,有时我们需要存放多个数据,因此也就有了集合的存在,这篇博客着重讲解一下java8给我们带来的一些类关于Collection的操作。
Collection接口
在java8中新增加了一个forEach方法,可以使用Lambda表达式来遍历集合元素
2.使用Lambda遍历Iterator
3.java8中增加的Predicate操作集合
4.Stream操作集合
5.Collection操作集合
在平常的开发中,有时我们需要存放多个数据,因此也就有了集合的存在,这篇博客着重讲解一下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中为我们增加了那些好的遍历集合的操作?
在java8中新增加了一个forEach方法,可以使用Lambda表达式来遍历集合元素
- <span style="font-family:Comic Sans MS;font-size:18px;">
- /**
- * @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));
- }
- }
- </span>
2.使用Lambda遍历Iterator
java8中为Iterator增加了一个forEachRemaining方法,,也可以使用Lambda来遍历
- <span style="font-family:Comic Sans MS;font-size:18px;">/**
- * @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));
- }
- }
- </span>
3.java8中增加的Predicate操作集合
在java8中为Collection集合增加了一个removeIF方法,也可以用来操作lambda
- <span style="font-family:Comic Sans MS;font-size:18px;">
- 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;
- }
- }
- </span>
4.Stream操作集合
在java8中还增加了Stream、intStream、LongStream、DoubleStream等流式API,并且java8中还为每个API提供了对应的Builder,例如StreamBuilder、IntStreamBuilder等
- <span style="font-family:Comic Sans MS;font-size:18px;">/**
- * @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
- }
- }
- </span>
5.Collection操作集合
在java8中还为Collection提供了stream()默认方法,改方法用来返回该集合对应的流
- <span style="font-family:Comic Sans MS;font-size:18px;">
- /**
- * @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
- }
- }</span>
- 原文地址:点击打开链接