Collection是List,Queue和Set接口的父接口,該接口里定義的方法即可用于操作Set集合,也可以用于List和Queue集合。Collection接口里定義了如下操作元素的方法。
boolean add(object o):該方法用于向一個集合中里添加一個元素。如果集合對象被添加操作改變了,則返回true。
boolean addAll(Collection c):將集合c中的所有元素添加到指定的集合中。如果集合對象被添加操作改變了,則返回true。
void clear():清除集合里的所有元素,將集合長度變?yōu)?。
boolean contatins(Objeect o):返回集合中是否包含指定元素o。如果包含,返回true。
boolean containsAll(Collection c):返回集合中是否包含集合c中的所有元素。如果包含,返回true。
boolean isEmpty():返回集合是否為空。當(dāng)集合長度為零時,返回true;否則返回false。
Iterator iterator():返回一個Iterator對象,用于遍歷集合中的元素。
boolean remove(Object o):刪除集合中的指定元素o,當(dāng)集合中包含多個o元素時,只刪除第一個符合條件的o元素,該方法返回true。
boolean removeAll(Collection c):刪除集合中所有集合c包含的元素(相當(dāng)于當(dāng)前集合減去集合c),如果該方法改變了調(diào)用該方法的集合,則該方法返回true。
boolean retainAll(Collection c):刪除集合中所有集合c不包含的元素(相當(dāng)于求當(dāng)前集合于集合c的交集),如果該方法改變了調(diào)用了該方法的集合,則該方法返回true。
int size():返回集合的長度。
Object[] toArray():將集合轉(zhuǎn)換為一個數(shù)組,所有集合元素變成相應(yīng)的數(shù)組元素。
public class CollectionTest { public static void main(String[] args){ Collection c = new ArrayList(); //添加元素 c.add("孫悟空"); c.add(6); System.out.使用Lambda表達式遍歷集合:
java8為Iterble接口新增了了一個foreach(Consumer action)接口,該方法所需的參數(shù)類型是一個函數(shù)式接口,而Iterable是Collection接口的父接口,應(yīng)此Collection可以直接調(diào)用此方法。
當(dāng)程序調(diào)用Iterable的foreach(Consumer action)遍歷集合元素時,程序會依次將集合元素傳給Comsumer的accept(T t)方法(該方法中唯一的抽象方法)。
public class CollectionEach { public static void main(String[] args){ Collection books = new HashSet(); books.add("輕量級java企業(yè)應(yīng)用開發(fā)"); books.add("瘋狂java講義"); books.add("瘋狂android"); /*輸出:迭代集合為:瘋狂java講義 迭代集合為:輕量級java企業(yè)應(yīng)用開發(fā) 迭代集合為:瘋狂android*/ books.forEach(obj -> System.out.println("迭代集合為:" + obj)); }}使用java8增強的Ieteraor遍歷集合元素:
Iteraor接口也是java集合框架中的成員,主要用于遍歷Collection集合中的元素,Iterator對象也被稱為迭代器。
Iteraor定義了一些方法:
boolean hasnext(): 如果被迭代的元素還沒有遍歷完,則返回true。
Object next(): 返回集合中的下一個元素。
void remove():刪除集合集合中上一次next方法返回的元素。
void forEachRemning(Consumer action):使用Lambda表達式遍歷集合。
當(dāng)使用Iterator迭代訪問Collection集合元素時,Collection集合里的元素不能被改變,只有通過Iterator的remove方法刪除上一次next()方法返回的集合元素才可以,否則會引發(fā)異常。
public class IteratorTest2 { public static void main(String[] args){ Collection books = new HashSet(); books.add("輕量級java企業(yè)應(yīng)用開發(fā)"); books.add("瘋狂java講義"); books.add("瘋狂android"); Iterator it = books.iterator(); while(it.hasNext()){ String book = (String)it.next(); //輸出:瘋狂java講義 // 輕量級java企業(yè)應(yīng)用開發(fā) // 瘋狂android System.out.println(book); if (book.equals("瘋狂java講義")) { it.remove(); } } //輸出:[輕量級java企業(yè)應(yīng)用開發(fā), 瘋狂android] System.out.println(books); }}使用Lambda表達式遍歷Iterator
java8為Iterator提供了一個forEachRemning(Consumer action)方法,該方法所需的也是Consumer參數(shù)同樣也是函數(shù)式接口。當(dāng)程序調(diào)用Iterator的forEachRemning(Consumer action)遍歷集合元素時,程序會依次將集合元素傳給Consumer的accept(T t)方法(該接口中唯一的方法)。
public class IteratorEach { public static void main(String[] args){ Collection books = new HashSet(); books.add("輕量級java企業(yè)應(yīng)用開發(fā)"); books.add("瘋狂java講義"); books.add("瘋狂android"); Iterator it = books.iterator(); /*迭代元素集合為:瘋狂java講義 迭代元素集合為:輕量級java企業(yè)應(yīng)用開發(fā) 迭代元素集合為:瘋狂android*/ it.forEachRemaining(obj -> System.out.println("迭代元素集合為:" + obj)); }}使用foreach循環(huán)遍歷集合元素
除了可以使用Iterator接口迭代訪問Collection集合里的元素之外,使用java5提供的foreach循環(huán)迭代訪問集合元素更加快捷。
public class ForeachTest { public static void main(String[] args){ Collection books = new HashSet(); books.add("輕量級java企業(yè)應(yīng)用開發(fā)"); books.add("瘋狂java講義"); books.add("瘋狂android"); for(Object obj : books){ String book = (String)obj; /*瘋狂java講義 輕量級java企業(yè)應(yīng)用開發(fā) 瘋狂android*/ System.out.println(book); if (book.equals("瘋狂Andriod講義")) { //下面代碼將要引發(fā)異常 books.remove(book); } } //[瘋狂java講義, 輕量級java企業(yè)應(yīng)用開發(fā), 瘋狂android] System.out.println(books); }使用java8新增的Prdicate操作集合:
java8為Collectio集合新增一個removeIf(Predicate filter)方法,該方法將會批量刪除符合filter條件的所有元素。
public class PredicateTest { public static void main(String[] args){ Collection books = new HashSet(); books.add(new String("輕量級java應(yīng)用開發(fā)")); books.add(new String("瘋狂java講義")); books.add(new String("瘋狂IOS講義")); books.add(new String("瘋狂Ajax講義")); books.add(new String("瘋狂android講義")); //統(tǒng)計書名包括“瘋狂”子串的圖書數(shù)量.輸出:4 System.out.println(calAll(books,ele -> ((String)ele).contains("瘋狂"))); //統(tǒng)計書名字符串長度大于10的圖書數(shù)量.輸出:2 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){ if (p.test(obj)) { total++; } } return total; }}使用java8新增的Stream操作集合:
java8新增了Stream,IntStream,LongStream,DoubleStream等流式API,這些api代表多個支持串行和并行聚集操作的元素。上面四個接口中,Stream代表一個通用的流接口,其他則分別代表元素類型為int,long,double的流。
獨立使用流的方法:
1.使用Stream或Xxxstream的builder()類方法創(chuàng)建該Stream對應(yīng)的Builder。
2.重復(fù)調(diào)用Budiler的add()方法,向該流中添加多個元素。
3.調(diào)用Builder的build()方法獲取相應(yīng)的Stream。
4.調(diào)用Stream的聚集方法。
對于大部分的聚集方法而言,每個Stream只能執(zhí)行一次。
Stream提供了大量的方法進行聚集操作,這些方法既可以是”中間的“,也可以是”末端的“。
〉中間方法:中間操作允許流保持打開操作,并且可以直接調(diào)用后續(xù)的方法。中間方法的返回值是另一個流。
〉末端方法:末端方法是對流的最終操作。當(dāng)對某個Stream對象執(zhí)行末端方法后,該流將會被”消耗“,且不可再用。
除此之外,關(guān)于流的方法還有如下兩個特征:
1.有狀態(tài)的方法:這個方法會為流增加一些新的特征,比如元素的唯一性,元素的最大數(shù)量,保證元素以排序的方式被處理。有狀態(tài)的方法往往需要更大的開銷。
2.短路方法:短路方法可以盡早結(jié)束對流的操作,不必檢查每個元素。
Stream常用的中間方法:
filter(Predicate predicate):過濾所有不符合predicate的元素。
map ToXxx(ToXxxFunction mapper):使用ToXxxFunction對流中的元素進行一對一的轉(zhuǎn)換,返回一個新流包含轉(zhuǎn)換后生成的所用元素。
peek(Consumer action):依次對每個元素執(zhí)行一些操作,該方法返回的流與原有流包含相同的元素。該方法主要用于調(diào)試。
distinct():該方法用于排序流中所用重復(fù)的元素(判斷元素重復(fù)的標(biāo)準(zhǔn)是使用equals()方法比較返回true)。這是一個有狀態(tài)的方法。
sorted():該方法保證流中的元素在后續(xù)的操作中處于有序狀態(tài)。這是一個有狀態(tài)的方法。
limit(long maxSize):該方法用于保證對流的后續(xù)訪問中最大允許的元素個數(shù)。這是一個有狀態(tài),短路方法。
常用的末端方法:
forEach(Consumer action):遍歷流中的元素,對每個元素執(zhí)行action。
toArray():將流中所有的元素轉(zhuǎn)換為數(shù)組形式。
reduce():該方法有三個重載的版本,都用于通過某種操作來合并流中的元素。
min():返回流中元素的最小值。
max():返回流中元素的最大值。
count():返回流中所用元素的數(shù)值。
anyMatch(Predicate predicate):判斷流中是否至少包含一個符合Predicate條件。
allMatch(Predicate predicate):判斷流中是否每個元素都符合Predicate條件。
noneMatch(Predicate predicate):判斷流中是否所有元素都不包括符和Predicate條件。
findFirst():返回流中第一個元素。
findAny():返回流中任意一個元素。
public class CollectionStream { public static void main(String[] args){ Collection books = new HashSet(); books.add(new String("輕量級java應(yīng)用開發(fā)")); books.add(new String("瘋狂java講義")); books.add(new String("瘋狂IOS講義")); books.add(new String("瘋狂Ajax講義")); books.add(new String("瘋狂android講義")); //統(tǒng)計書中包含“瘋狂”子串的圖書數(shù)量 //輸出:4 System.out.println(books.stream() .filter(ele -> ((String)ele).contains("瘋狂")) .count()); //統(tǒng)計書名中包含“java”子串的圖書數(shù)量 //輸出:2 System.out.println(books.stream() .filter(ele -> ((String)ele).contains("java")) .count()); //統(tǒng)計圖書中字符串長度大于10的圖書數(shù)量 //輸出:2 System.out.println(books.stream() .filter(ele -> ((String)ele).length() > 10) .count()); /*先調(diào)用Collection對象的stream方法將集合轉(zhuǎn)換為Stream * 再調(diào)用Stream中的mapToXxx()方法,進行轉(zhuǎn)換 */ books.stream().mapToInt(ele -> ((String)ele).length()) //用forEach方法遍歷IntStream中每個元素 //輸出:8 8 7 11 11 .forEach(System.out::println); }}---------《瘋狂java講義》8.2
|
新聞熱點
疑難解答