Java8新特性(1)—— Stream集合運算流入門學習

廢話,寫在前面

  • 很久沒寫博客了,懶了,之後自覺寫寫博客,每週兩三篇吧!
  • 簡單記錄本身的學習經歷,算是對本身的一點小小的督促!
  • Java8的新特性不少,好比流處理在工做中看到不少的地方都在用,是時候扔掉笨重的for循環了!節省40%-50%代碼量!Come on!

如題 (總結要點)

  • Stream API只能被消費一次,後續重複使用已創建的流會報異常!因此stream流是線程安全的!
  • 好比執行「stream.forEach(System.out::println);stream.forEach(System.out::println);」連續兩次,
  • 出現java.lang.IllegalStateException: stream has already been operated upon or closed。java

  • 原文連接 :數組

借鑑學習文章列表

1.主題

package com.jdk8.newFeatures;

import org.junit.Test;

import javax.swing.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 測試Stream 的集合流
 */
public class StreamTest01 {
    @Test
    public void test(){
       // 1-1準備初始的數據流,經過已有的集合來建立流 無存儲。
             //Stream不是一種數據結構,它只是某種數據源的一個視圖,數據源能夠是一個數組,Java容器或I/O channel等
        List<String> strings = new ArrayList<>(Arrays.asList("111","222","333"));
        // 1-2建立Stream
        Stream stream = strings.stream();
        stream.forEach(System.out::println);
//        stream.forEach(System.out::println);   // 不加註釋,會對stream操做兩次,出現java.lang.IllegalStateException: stream has already been operated upon or closed

        // 1-3 或者經過已有的數據來建立Stream建立流,可使用Stream類提供的Stream.of()方法,直接返回一個由指定元素組成的流。
        Stream<String> streamxx = Stream.of("aaa","bbb","ccc");
        streamxx.forEach(
                i->System.out.println("(2)"+i)
        );

        //2-1 filter 過濾條件  中間操做
        List<String> lists = Arrays.asList("AAA","","BBB","CCC");
        lists.stream().filter(s -> s.length()>0).forEach(i -> System.out.println("filter後:"+i));

        // 2-2 map映射 中間操做
        List<Integer> numbers = Arrays.asList(11,2,3,14,14);
        numbers.stream().map(i->i*i).forEach(i -> System.out.println("平方數後:"+i));

        // 2-3 limit/skip limit ,返回 Stream 的前面 n 個元素;skip 則是扔掉前 n 個元素
        System.out.println("執行limit後:");
        numbers.stream().limit(4).forEach(System.out::println);

        // 2-4 sorted 方法用於對流進行排序
        System.out.println("排序後:");
        numbers.stream().sorted().forEach(System.out::println);

        // 2-5 distinct主要用來去重,如下代碼片斷使用 distinct 對元素進行去重
        System.out.println("distinct 對元素進行去重: ");
        numbers.stream().distinct().forEach(System.out::println);

        // 3 Stream的最終操做 : 計算出流中元素的個數、將流裝換成集合等。
        //3-1 最終結果討論 count用來統計流中的個數
        System.out.println("count用來統計流中的元素個數: ");
        System.out.println(numbers.stream().count());

        //3-2 forEach 遍歷單個子元素進行操做,ints()返回的是一個intStream()
        new Random().ints().limit(4).forEach(System.out::println);

        //3-3 collect 就是一個規約操做,能夠接受各類作法做爲參數,將流中的元素累計匯成集合框架中的一種,如List
        List<String> string3 = Arrays.asList("Hollis", "HollisChuang", "hollis","Hollis666", "Hello", "HelloWorld", "Hollis");
        string3  = string3.stream().filter(string -> string.startsWith("Hollis")).collect(Collectors.toList());
        System.out.println("string3的collect後的測試是:"+string3);

    }
}

測試結果

111
222
333
(2)aaa
(2)bbb
(2)ccc
filter後:AAA
filter後:BBB
filter後:CCC
平方數後:121
平方數後:4
平方數後:9
平方數後:196
平方數後:196
執行limit後:
11
2
3
14
排序後:
2
3
11
14
14
distinct 對元素進行去重: 
11
2
3
14
count用來統計流中的元素個數: 
5
1651256773
1647013782
-1530012352
1888788786
string3的collect後的測試是:[Hollis, HollisChuang, Hollis666, Hollis]
相關文章
相關標籤/搜索