- Java核心編程
- 柳偉衛(wèi)
- 1067字
- 2020-11-23 15:08:34
4.2 Collection接口
所有通用集合實(shí)現(xiàn)都有一個(gè)帶有Collection參數(shù)的構(gòu)造函數(shù),此構(gòu)造函數(shù)(稱(chēng)為轉(zhuǎn)換構(gòu)造函數(shù))初始化新集合以包含指定集合中的所有元素。換句話說(shuō),它允許轉(zhuǎn)換集合的類(lèi)型。這使得Collection接口有著非常高的通用性。
例如,有一個(gè)Collection<String> c,它可以轉(zhuǎn)化成List、Set或其他類(lèi)型的Collection。以下是代碼示例:

Collection接口包含執(zhí)行基本操作的方法,例如int size()、boolean isEmpty()、boolean contains(Object element)、boolean add(E element)、boolean remove(Object element)和Iterator<E> iterator()。
Collection接口還包含對(duì)整個(gè)集合進(jìn)行操作的方法,例如boolean containsAll(Collection<?> c)、boolean addAll(Collection<? extends E> c)、boolean removeAll(Collection<?> c)、boolean retainAll(Collection<?> c)和void clear()。
Collection接口還存在用于數(shù)組操作的附加方法,例如Object[] toArray()和<T> T[] toArray(T[] a)。
在JDK 8及更高版本中,Collection接口還公開(kāi)方法Stream<E> stream()和Stream<E> parallelStream(),以從底層集合中獲取順序或并行流。有關(guān)流的更多信息可以參閱第13章。
4.2.1 遍歷集合
Java提供了3種遍歷集合的方法:使用聚合操作、使用for-each和使用迭代器。
1.使用聚合操作
在JDK 8及更高版本中,迭代集合的首選方法是獲取流并對(duì)其執(zhí)行聚合操作。聚合操作通常與Lambda表達(dá)式結(jié)合使用,以使用較少的代碼使編程更具表現(xiàn)力。以下代碼按順序遍歷一組形狀并打印出紅色對(duì)象:
myShapesCollection.stream() .filter(e - > e.getColor()== Color.RED) .forEach(e - > System.out.println(e.getName()));
使用此API收集數(shù)據(jù)的方法有很多種。例如,可能希望將Collection的元素轉(zhuǎn)換為String對(duì)象,然后將它們連接起來(lái),用逗號(hào)分隔:
String joined = elements.stream() .map(Object::toString) .collect(Collectors.joining(", "));
或者用于統(tǒng)計(jì)所有員工的工資:
int total = employees.stream() .collect(Collectors.summingInt(Employee::getSalary)));
2.使用for-each
for-each允許使用for循環(huán)簡(jiǎn)明地遍歷集合或數(shù)組。以下代碼示例使用for-each在單獨(dú)的行上打印出集合的每個(gè)元素:

3.使用迭代器
使用迭代器Iterator對(duì)象可以遍歷集合并有選擇地從集合中刪除元素。通過(guò)調(diào)用集合的iterator方法來(lái)獲得集合的Iterator。以下是Iterator接口:

如果迭代器具有更多元素,則hasNext方法返回true,并且下一個(gè)方法返回迭代中的下一個(gè)元素。remove方法從基礎(chǔ)Collection中刪除next返回的最后一個(gè)元素。每次調(diào)用next時(shí),只調(diào)用remove方法一次,如果違反此規(guī)則就拋出異常。
比如在下面的例子中需要過(guò)濾特定的元素,則應(yīng)選擇使用Iterator而不是for-each:

4.2.2 集合接口批量操作
批量操作對(duì)整個(gè)集合執(zhí)行操作。雖然可以使用基本操作來(lái)實(shí)現(xiàn),但是在大多數(shù)情況下此類(lèi)實(shí)現(xiàn)往往效率比較低。以下是批量操作:
· containsAll:如果目標(biāo)Collection包含指定Collection中的所有元素,就返回true。
· addAll:將指定Collection中的所有元素添加到目標(biāo)Collection。
· removeAll:從目標(biāo)Collection中刪除包含在指定Collection中的所有元素。
· retainAll:從目標(biāo)Collection中刪除所有未包含在指定Collection中的元素。也就是說(shuō),它僅保留目標(biāo)Collection中也包含在指定Collection中的那些元素。
· clear:從集合中刪除所有元素。
如果在執(zhí)行操作的過(guò)程中修改了目標(biāo)Collection,那么addAll、removeAll和retainAll方法會(huì)返回true。
下面是批量操作功能的一個(gè)簡(jiǎn)單示例,用于從Collection中刪除指定元素的所有實(shí)例e:
c.removeAll(Collections.singleton(e));
假設(shè)要從Collection中刪除所有null元素,代碼如下:

Collections.singleton是一個(gè)靜態(tài)工廠方法,返回一個(gè)只包含指定元素的不可變Set。
- OpenStack Cloud Computing Cookbook(Third Edition)
- 數(shù)據(jù)庫(kù)系統(tǒng)教程(第2版)
- 零起步玩轉(zhuǎn)掌控板與Mind+
- JMeter 性能測(cè)試實(shí)戰(zhàn)(第2版)
- Django Design Patterns and Best Practices
- 深入理解Java7:核心技術(shù)與最佳實(shí)踐
- 教孩子學(xué)編程:C++入門(mén)圖解
- Python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
- Visual Basic學(xué)習(xí)手冊(cè)
- Julia高性能科學(xué)計(jì)算(第2版)
- Python爬蟲(chóng)、數(shù)據(jù)分析與可視化:工具詳解與案例實(shí)戰(zhàn)
- 打開(kāi)Go語(yǔ)言之門(mén):入門(mén)、實(shí)戰(zhàn)與進(jìn)階
- TypeScript全棧開(kāi)發(fā)
- 實(shí)驗(yàn)編程:PsychoPy從入門(mén)到精通
- Yii2 By Example