Java8系列--Java Stream入門篇(流的創建)

1 前言

流的創建方法有很多,除了我們經常用的使用集合創建流,還可以通過值、數組、文件、函數等方法來創建流。
參照下圖
chuangjian

2 流的構建方法詳解

2.1 由值創建流

使用靜態方法Stream.of方法,通過顯式值創建一個流,它可以接受任何數量的參數。
代碼示例

//由值創建流
    public static void createStreamByValue() {
        System.out.println("---createStreamByValue---");
        //空流
        Stream<String> emptyStream = Stream.empty();
        System.out.println("---輸出空流---");
        emptyStream.forEach(System.out::println);
        //String類型
        Stream<String> stringStream = Stream.of("Java8", "In", "Action");
        System.out.println("---輸出String型的流---");
        stringStream.forEach(System.out::println);
        //Integer類型
        Stream<Integer> integerStream = Stream.of(12, 11, 10);
        System.out.println("---輸出Integer型的流---");
        integerStream.forEach(System.out::println);
    }

2.2 由數組創建流

使用靜態方法Arrays.stream方法從數組創建一個流,它可以接受一個數組作爲參數。
代碼示例

//由數組創建流
    public static void createStreamByArray() {
        System.out.println("---createStreamByArray---");
        //String類型
        String[] characters = {"Java8", "In", "Action"};
        Stream<String> stream1 = Arrays.stream(characters);
        System.out.println("---createStreamByArray-輸出String型的流---");
        stream1.forEach(System.out::println);
        //Integer類型
        Integer[] numbers = {1, 2, 6, 78, 45};
        Stream<Integer> stream2 = Arrays.stream(numbers);
        System.out.println("---createStreamByArray-輸出Integer型的流---");
        stream2.forEach(System.out::println);
    }

2.3 由集合創建流

使用靜態方法List.stream方法從數組創建一個流,不需要參數。
代碼示例

//由集合創建流
    public static void createStreamByList() {
        System.out.println("---createStreamByList---");
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("python");
        list.add("c++");
        list.add("c");
        list.add("lisp");

        Stream<String> listStream = list.stream();
        System.out.println("---createStreamByList-輸出String型的流---");
        listStream.forEach(System.out::println);
    }

2.4 由文件創建流

Java中用於處理文件等I/O操作的NIO API(非阻塞I/P)已更新,以便使用Stream API。java.nio.file.Files中的很多靜態方法都會返回一個流。
例如Files.lines方法,返回一個由指定文件中的各行構成的字符串流。
代碼示例:

//由文件創建流
    public static void createStreamByFile() throws IOException {
        System.out.println("---createStreamByFile---");
        long wordsNumbers = 0;
        try (Stream<String> lines = Files.lines(Paths.get("/home/gaoziqiang/data.txt"), Charset.defaultCharset())) {
            wordsNumbers = lines.flatMap(line -> Arrays.stream(line.split("")))
                    .distinct()
                    .count();
        }
        System.out.println("---數量是: " + wordsNumbers + "---");
    }

2.5 由函數創建流

Stream API提供了兩個靜態方法來從函數生成流:Stream.iterate和Stream.generate。真兩種方法都可以創建無限流。
1.迭代iterate
迭代法創建流通常用於按照某個創建原則(例如函數)依次生成一系列值的時候,而且爲了避免無限流通常需要進行limit限制。
代碼例:

//由函數生成流--迭代
    public static void createStreamByFunctionIterate() {
        System.out.println("---createStreamByFunctionIterate---");
        Stream.iterate(0, n -> n + 2)
                .limit(10)
                .forEach(System.out::println);
        //菲波納契數列
        System.out.println("---createStreamByFunction-菲波納契數列---");
        Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]})
                .limit(10)
                .map(t -> t[0])
                .forEach(System.out::println);
    }

2.生成generate
與iterate方法不同的是,generate方法不是對每個新生成的值應用函數的,它接受一個特定的新值生成器,並且該生成器需要支持Lambda表達式。
代碼示例:

//由函數生成流--生成
    public static void createStreamByFunctionGenerate() {
        System.out.println("---createStreamByFunctionGenerate---");
        //隨機數
        Stream.generate(Math::random)
                .limit(10)
                .forEach(System.out::println);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章