Java8中新增加的集合類
阿新 • • 發佈:2019-02-20
前言
在平常的開發中,有時我們需要存放多個數據,因此也就有了集合的存在,這篇部落格著重講解一下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
}
}