1. 程式人生 > 其它 >☕ Java 8 新增操作集合的方法

☕ Java 8 新增操作集合的方法

1.Predicate

Java 8 起為 Collection 集合新增了 一個 removeIf(Predicate filter)方法。

傳入 Predicate 物件引數

  • removeIf(Predicate filter),該方法將會批量刪除符合 filter 條件的所有元素 。

    Predicate是函式式介面,因此可以Lambda表示式作為引數

    books.removeIf(elem -> ((String) elem).length() < 10); // 所有長度小於 10 的字串元素都會被刪除
    

例項:

//先定義了 一個 calAllO方法,該方法將會使用 Predicate 判斷每個集合元素是否符合特定條件
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;
}
// 統計書名中出現"實戰" 字串的圖書數量 。
System.out.println(calAll(books, elem -> ((String) elem).contains("實戰")));
// 統計書名中出現 "Java" 宇符串的圖書數量。
System.out.println(calAll(books, elem -> ((String) elem).contains("Java")));
// 統計書名長度大於 10 的圖書數量 。
System.out.println(calAll(books, elem -> ((String) elem).length() > 10));

2. Stream

Stream 是一個通用的流介面,而 IntStream、 LongStream、DoubleStream 則代表元素型別為 int、 long、 double 的流。

這些 API 代表多個支援序列和並行聚合操作的元素。

Java 8 為API提供了對應的 Builder (如,Stream.Builder、IntStream.Builder)來建立相應的流。

獨立使用Stream的步驟:

  • 使用 Stream 的 builder() 類方法建立相應的 Builder
  • 重複呼叫 Builder 的 add() 方法往流中新增多個元素
  • 呼叫 Builder 的 【build()
    】方法獲取對應的 Stream
  • 呼叫 Stream 的聚合方法
// step 1
IntStream ins = IntStream.builder()
    .add(10)  // step2
    .add(2)
    .add(-4)
    .build(); // step3

// step 4
//  System.out.println("ins中最大值:" + ins.max().getAsInt());
//  System.out.println("ins中最小值:" + ins.min().getAsInt());
//  System.out.println("ins中元素總和:" + ins.sum());
//  System.out.println("ins中元素總數:" + ins.count());
//  System.out.println("ins中元素平均值:" + ins.average().getAsDouble());
//  System.out.println("ins中所有元素的平方是否大於20: " + ins.allMatch(elem -> elem * elem > 20));
//  System.out.println("ins中是否包含任何元素的平方大於20:" + ins.anyMatch(elem -> elem * elem > 20));
//  將 is 對映成一個新 Stream ,新 Stream 的每個元素是原 Stream 元素的 2 倍 +1
IntStream newIns = ins.map(elem -> elem * 2 + 1);

每個Stream只能執行一次, 其餘程式碼需要註釋掉。

用流操作集合

// 統計書名中出現"瘋狂" 字串的圖書數量 。
System.out.println(books.stream().filter(
    elem -> ((String) elem).contains("瘋狂")).count());
// 統計書名中出現 "Java" 宇符串的圖書數量。
System.out.println(books.stream().filter(
    elem -> ((String) elem).contains("Java")).count());
// 統計書名長度大於 10 的圖書數量 。
System.out.println(books.stream().filter(
    elem->((String) elem).length() > 10).count());

//先呼叫 Co11ection 物件的 stream ()方法將集合轉換為 Stream
//再呼叫 St ream 的 mapToInt ()方法獲取原有的 Stream 對應的 IntStream
books.stream().mapToInt(elem->((String)elem).length())
    .forEach(System.out::println);