java8-Stream流_處理list數組_簡單了解


支持順序和並行聚合操作的一系列元素。

看一個JAVA 8_API(地址:https://www.matools.com/api/java8)的示例:

int sum = widgets.stream() 
        .filter(w -> w.getColor() == RED)
        .mapToInt(w -> w.getWeight())
        .sum();

分析:widgetsCollection<Widget>,通過Collection.stream()創建一個Widget對象的流, .filter()——過濾這個流以產生僅包含紅色小部件的流(這個過濾,我覺得換成保留較好,filter()
就是保留滿足方法內條件的數據
),然后過濾保留后的值,通過mapToInt方法轉換為表示每個紅色小部件的權重的int值。 然后將該流相加以產生總重量。
除了Stream ,其為對象引用的流,存在原語特為IntStream , LongStreamDoubleStream ,所有這些都稱為“流”和符合此處描述的特征和限制。
用途:對集合元素進行篩選、排序和聚合等。

和以前的Collection操作不同, Stream操作還有兩個基礎的特征:

  • Pipelining: 中間操作都會返回流對象本身。 這樣多個操作可以串聯成一個管道, 如同流式風格(fluent style)。 這樣做可以對操作進行優化, 比如延遲執行(laziness)和短路( short-circuiting)。
  • 內部迭代: 以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進行迭代, 這叫做外部迭代。 Stream提供了內部迭代的方式, 通過訪問者模式(Visitor)實現。

 實例:

public static void main(String[] args) {

        
        List<String> strings = Arrays.asList("aa","","bbbb","","cc","","dddd");
        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5,1,2,9,132);


        System.out.println("java 8  操作數組-------");
        System.out.println("數組:" + strings);
        Long nullCount = strings.stream()
                .filter(s -> s.isEmpty())
                .count();
        List<String> nullStrings = strings.stream()
                .filter(s -> s.isEmpty())
                .collect(Collectors.toList());
        System.out.println("空字符串的數量:" + nullCount);
        System.out.println("空字符串:" + nullStrings);

        Long threeCount = strings.stream()
                .filter(s -> s.length()>3)
                .count();
        List<String> threeStrings = strings.stream()
                .filter(s -> s.length()>3)
                .collect(Collectors.toList());
        System.out.println("長度大於三的字符串的數量:" + threeCount);
        System.out.println("長度大於三的字符串:" + threeStrings);


        String joinStrings = strings.stream()
                .filter(s -> s.length()>3)
                .collect(Collectors.joining(","));
        System.out.println("合並字符串:" + joinStrings);

        //獲取平方數
        System.out.println("數字 數組------------------");
        List<Integer> squaresList = numbers.stream()
                .map(integer -> integer*integer)
                .distinct() //去重
                .collect(Collectors.toList());
        System.out.println("獲取平方數:" + squaresList);

        IntSummaryStatistics statistics = numbers.stream()
                .mapToInt(s->s)
                .summaryStatistics();
        System.out.println("列表中最大的數 : " + statistics.getMax());
        System.out.println("列表中最小的數 : " + statistics.getMin());
        System.out.println("所有數之和 : " + statistics.getSum());
        System.out.println("平均數 : " + statistics.getAverage());
        System.out.println("隨機數: ");
        Random random = new Random();
        random.ints().limit(10).sorted().forEach(System.out::println);

        // 並行處理
        List<String> parallelString = strings.parallelStream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        System.out.println("空字符串的數量為: " + parallelString);
    }

輸出結果:

java 8 操作數組-------
數組:[aa, , bbbb, , cc, , dddd]
空字符串的數量:3
空字符串:[, , ]
長度大於三的字符串的數量:2
長度大於三的字符串:[bbbb, dddd]
合並字符串:bbbb,dddd
數字 數組------------------
獲取平方數:[9, 4, 49, 25, 1, 81, 17424]
列表中最大的數 : 132
列表中最小的數 : 1
所有數之和 : 169
平均數 : 15.363636363636363
隨機數:
-1605871186
-930090087
-760378224
-160815069
-155865019
-78365962
795529794
909733837
1127503219
1774549966
空字符串的數量為: [aa, bbbb, cc, dddd]

Process finished with exit code 0

 


免責聲明!

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



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