java集合 之 Collection和Iterator接口


 

Collection是List,Queue和Set接口的父接口,該接口里定義的方法即可用於操作Set集合,也可以用於List和Queue集合。Collection接口里定義了如下操作元素的方法。

boolean add(object o):該方法用於向一個集合中里添加一個元素。如果集合對象被添加操作改變了,則返回true。

boolean addAll(Collection c):將集合c中的所有元素添加到指定的集合中。如果集合對象被添加操作改變了,則返回true。

void clear():清除集合里的所有元素,將集合長度變為0。

boolean contatins(Objeect o):返回集合中是否包含指定元素o。如果包含,返回true。

boolean containsAll(Collection c):返回集合中是否包含集合c中的所有元素。如果包含,返回true。

boolean isEmpty():返回集合是否為空。當集合長度為零時,返回true;否則返回false。

Iterator iterator():返回一個Iterator對象,用於遍歷集合中的元素。

boolean remove(Object o):刪除集合中的指定元素o,當集合中包含多個o元素時,只刪除第一個符合條件的o元素,該方法返回true。

boolean removeAll(Collection c):刪除集合中所有集合c包含的元素(相當於當前集合減去集合c),如果該方法改變了調用該方法的集合,則該方法返回true。

boolean retainAll(Collection c):刪除集合中所有集合c不包含的元素(相當於求當前集合於集合c的交集),如果該方法改變了調用了該方法的集合,則該方法返回true。

int size():返回集合的長度。

Object[] toArray():將集合轉換為一個數組,所有集合元素變成相應的數組元素。

 

public class CollectionTest {

    public static void main(String[] args){
        Collection c = new ArrayList();
        //添加元素
        c.add("孫悟空");
        c.add(6);
        System.out.println("c集合中的元素個數為:" + c.size());
        //刪除元素
        c.remove(6);
        System.out.println("c集合中的元素個數為:" + c.size());
        System.out.println("c集合中是否包含‘孫悟空’:" + c.contains("孫悟空"));
        c.add("輕量級java應用開發");
        System.out.println("c集合中的元素為:" + c);
        Collection books = new HashSet();
        books.add("輕量級java應用開發"); books.add("瘋狂java講義");
        System.out.println("c集合是否完全包括集合books:" + c.containsAll(books));
        c.removeAll(books);
        System.out.println("c集合中的元素為:" + c);
        //清空集合c
        c.clear();
        System.out.println("c集合中的元素為:" + c);
        books.retainAll(c);
        System.out.println("books集合中的元素為:" + books);
    }
}

使用Lambda表達式遍歷集合:

java8為Iterble接口新增了了一個foreach(Consumer action)接口,該方法所需的參數類型是一個函數式接口,而Iterable是Collection接口的父接口,應此Collection可以直接調用此方法。

當程序調用Iterable的foreach(Consumer action)遍歷集合元素時,程序會依次將集合元素傳給Comsumer的accept(T t)方法(該方法中唯一的抽象方法)。

public class CollectionEach {

    public static void main(String[] args){
        Collection books = new HashSet();
        books.add("輕量級java企業應用開發");
        books.add("瘋狂java講義");
        books.add("瘋狂android");
        /*輸出:迭代集合為:瘋狂java講義
               迭代集合為:輕量級java企業應用開發
               迭代集合為:瘋狂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表達式遍歷集合。

當使用Iterator迭代訪問Collection集合元素時,Collection集合里的元素不能被改變,只有通過Iterator的remove方法刪除上一次next()方法返回的集合元素才可以,否則會引發異常。

public class IteratorTest2 {
    public static void main(String[] args){
        Collection books = new HashSet();
        books.add("輕量級java企業應用開發");
        books.add("瘋狂java講義");
        books.add("瘋狂android");
        Iterator it = books.iterator();
        while(it.hasNext()){
            String book = (String)it.next();
          //輸出:瘋狂java講義
// 輕量級java企業應用開發
// 瘋狂android

System.out.println(book);
if (book.equals("瘋狂java講義")) { it.remove(); } }        //輸出:[輕量級java企業應用開發, 瘋狂android]
     System.out.println(books); } }

使用Lambda表達式遍歷Iterator

java8為Iterator提供了一個forEachRemning(Consumer action)方法,該方法所需的也是Consumer參數同樣也是函數式接口。當程序調用Iterator的forEachRemning(Consumer action)遍歷集合元素時,程序會依次將集合元素傳給Consumer的accept(T t)方法(該接口中唯一的方法)。

public class IteratorEach {
    public static void main(String[] args){
        Collection books = new HashSet();
        books.add("輕量級java企業應用開發");
        books.add("瘋狂java講義");
        books.add("瘋狂android");
        Iterator it = books.iterator();
        /*迭代元素集合為:瘋狂java講義
              迭代元素集合為:輕量級java企業應用開發
              迭代元素集合為:瘋狂android*/
        it.forEachRemaining(obj -> System.out.println("迭代元素集合為:" + obj));
    }
}

使用foreach循環遍歷集合元素

除了可以使用Iterator接口迭代訪問Collection集合里的元素之外,使用java5提供的foreach循環迭代訪問集合元素更加快捷。

public class ForeachTest {
    public static void main(String[] args){
        Collection books = new HashSet();
        books.add("輕量級java企業應用開發");
        books.add("瘋狂java講義");
        books.add("瘋狂android");
        for(Object obj : books){
            String book = (String)obj;
            /*瘋狂java講義
            輕量級java企業應用開發
            瘋狂android*/
            System.out.println(book);
            if (book.equals("瘋狂Andriod講義")) {
                //下面代碼將要引發異常
                books.remove(book);
            }
        }
        //[瘋狂java講義, 輕量級java企業應用開發, 瘋狂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應用開發"));
        books.add(new String("瘋狂java講義"));
        books.add(new String("瘋狂IOS講義"));
        books.add(new String("瘋狂Ajax講義"));
        books.add(new String("瘋狂android講義"));
        //統計書名包括“瘋狂”子串的圖書數量.輸出:4
        System.out.println(calAll(books,ele -> ((String)ele).contains("瘋狂")));
        //統計書名字符串長度大於10的圖書數量.輸出: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()類方法創建該Stream對應的Builder。

2.重復調用Budiler的add()方法,向該流中添加多個元素。

3.調用Builder的build()方法獲取相應的Stream。

4.調用Stream的聚集方法。

對於大部分的聚集方法而言,每個Stream只能執行一次。

Stream提供了大量的方法進行聚集操作,這些方法既可以是”中間的“,也可以是”末端的“。

〉中間方法:中間操作允許流保持打開操作,並且可以直接調用后續的方法。中間方法的返回值是另一個流。

〉末端方法:末端方法是對流的最終操作。當對某個Stream對象執行末端方法后,該流將會被”消耗“,且不可再用。

除此之外,關於流的方法還有如下兩個特征:

1.有狀態的方法:這個方法會為流增加一些新的特征,比如元素的唯一性,元素的最大數量,保證元素以排序的方式被處理。有狀態的方法往往需要更大的開銷。

2.短路方法:短路方法可以盡早結束對流的操作,不必檢查每個元素。

Stream常用的中間方法

filter(Predicate predicate):過濾所有不符合predicate的元素。

map ToXxx(ToXxxFunction mapper):使用ToXxxFunction對流中的元素進行一對一的轉換,返回一個新流包含轉換后生成的所用元素。

peek(Consumer action):依次對每個元素執行一些操作,該方法返回的流與原有流包含相同的元素。該方法主要用於調試。

distinct():該方法用於排序流中所用重復的元素(判斷元素重復的標准是使用equals()方法比較返回true)。這是一個有狀態的方法。

sorted():該方法保證流中的元素在后續的操作中處於有序狀態。這是一個有狀態的方法。

limit(long maxSize):該方法用於保證對流的后續訪問中最大允許的元素個數。這是一個有狀態,短路方法。

常用的末端方法

forEach(Consumer action):遍歷流中的元素,對每個元素執行action。

toArray():將流中所有的元素轉換為數組形式。

reduce():該方法有三個重載的版本,都用於通過某種操作來合並流中的元素。

min():返回流中元素的最小值。

max():返回流中元素的最大值。

count():返回流中所用元素的數值。

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應用開發"));
        books.add(new String("瘋狂java講義"));
        books.add(new String("瘋狂IOS講義"));
        books.add(new String("瘋狂Ajax講義"));
        books.add(new String("瘋狂android講義"));
        //統計書中包含“瘋狂”子串的圖書數量
        //輸出:4
        System.out.println(books.stream()
                .filter(ele -> ((String)ele).contains("瘋狂"))
                .count());
        //統計書名中包含“java”子串的圖書數量
        //輸出:2
        System.out.println(books.stream()
                .filter(ele -> ((String)ele).contains("java"))
                .count());
        //統計圖書中字符串長度大於10的圖書數量
        //輸出:2
        System.out.println(books.stream()
                .filter(ele -> ((String)ele).length() > 10)
                .count());
        /*先調用Collection對象的stream方法將集合轉換為Stream
         * 再調用Stream中的mapToXxx()方法,進行轉換
         */
        books.stream().mapToInt(ele -> ((String)ele).length())
                //用forEach方法遍歷IntStream中每個元素
                //輸出:8 8 7 11 11
                .forEach(System.out::println);
    }
}

                                                                                                                                              ---------《瘋狂java講義》8.2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM