關於集合的操作(Collection/Iterator/Stream)


因為下文頻繁使用lambda表達式,關於Java中的lambda表達式內容請見:

http://www.cnblogs.com/guguli/p/4394676.html

 

一.使用增強的Iterator遍歷集合元素

  Iterator接口也是Java集合框架的成員,但它與Collection系列,Map系列的集合不一樣:Collection系列集合,Map系列集合主要用於承裝其他對象,而Iterator則主要用於遍歷(即迭代訪問)Collection集合中的元素,Iterator對象也被稱為迭代器。

  Iterator接口隱藏了各種Collection實現類的底層細節,向應用程序提供了遍歷Collection集合元素的統一編程接口,Iterator接口里面一般定義了下面4個方法。

boolean hasNext():返回表示集合元素是否有沒有被訪問完的布爾值。

Object next():返回集合里的下一個元素。

void remove():刪除集合里上一次next方法返回的元素。

void forEachRemaining(Consumer action):這是Java8為Iterator新增的默認方法,該方法可使用lambda表達式來遍歷集合元素。

public class IteratorTest{
    public static void main(String[] args){
        ....//c is a Collection<String>
        Iterator iter=c.iterator();
        while(iter.hasNext()){
            String s=(String)iter.next();
            System.out.println(s);
            if(s.equals("Content")){
                iter.remove();
            }
            s="New Content";
        }
        System.out.println(s);
    }
}


##Iterator僅用於遍歷集合,Iterator本身並不提供承裝對象的能力。

##Iterator必須依附於Collection對象,若有一個Iterator對象則必然有個與之關聯的Collection對象。

##Iterator迭代器采用的是快速失敗(fail-fast)機制,一旦在迭代過程中檢測到該集合已經被修改(通常是程序中的其他線程修改),程序立即拋出ConcurrentModificationException異常,而不是顯示修改后的結果,這樣可以避免共享資源而引發潛在的問題。

二.使用Java8新增的Predicate操作集合

Java8為Collection集合新增了一個removeIf(Predicate filter)方法,該方法將會批量刪除符合filter條件的所有元素,該方法需要一個Predicate對象作為作為參數,Predicate也是函數式接口,因此可使用Lambda表達式作為參數。

...
Collection c=new HashSet();
c.add(new String("Content 1"));
c.add(new String("Content 2"));
c.add(new String("Content 3"));
/// lambda expression
c.removeIf(s->((String)s).length()<10);
System.out.println(c);

使用Predicate可以充分簡化集合的運算,使用lambda表達式使整個程序簡介清晰。也可以使用callAll方法用一個Predicate類型的lambda表達式來進行全部篩選,類似於SQL語言中的select*。

三.使用Java8新增的Stream操作集合

Java8新增了Stream,IntStream,LongStream,DoubleStream等數據流處理的API,這些API代表多個支持串行和並行聚集操作的元素,上面4個接口中,Stream是一個通用的接口,而其他的**Stream接口則代表元素類型為Int/Double/Long的流。

Java8為上面每個流接口提供了對應的Builder,例如Stream.Builder..開發者可以使用這些Builder來創建對應的流。步驟如下:

##使用Stream或者**Stream的builder()類方法創建該Stream對應的Builder。

##重復調用Builder的add()方法向該流中添加元素。

##調用Builder的build()方法獲取對應的Stream

##調用Stream的聚集方法

關於Stream的聚集操作,主要羅列解釋如下(先解釋兩個概念##):

##intermediate(中間方法):中間操作允許流保持打開的狀態,並允許直接調用后續方法

##terminal(末端方法):末端操作時對流的最終操作,當對某個Stream執行末端方法后,該流將無法繼續使用

/////// Intermediate

(1)filter(Predicate p):返回全部使Predicate返回true的元素。

(2)mapToXxx(ToXxxFunction mapper):對每一個流中的元素按復寫ToXxxFunction的方法進行一對一的轉換。

(3)peek(Consumer c):類似於forEach操作。返回流於原有流包含相同的元素。該方法主要用於調試。

(4)distinct():該方法用於排序流中所有重復的元素。

(5)sorted():該方法用於保證流中的元素在后續的訪問中處於有序的狀態。

(6)limit(long maxSize):該方法用於保證對流的后續元素訪問中最大允許訪問的元素個數。

/////// Terminal

(1)forEach(Consumer c):遍歷元素對每一個元素執行c操作。

(2)toArray():將流中的所有元素轉換成為一個數組。

(3)reduce():合並流中的元素。

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

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

(6)count():返回流中的元素的數量。

(7)anyMatch(Predicate p):判斷流中是否至少包含一個元素符合p。

(8)noneMatch(Predicate p):判斷流中是否沒有包含一個元素符合p。

(9)allMatch(Predicate p):判斷流中是否所有元素都符合p。

(10)findAny():返回流中的任意一個元素。

 


免責聲明!

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



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