1 前言
流的創建方法有很多,除了我們經常用的使用集合創建流,還可以通過值、數組、文件、函數等方法來創建流。
參照下圖:
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);
}