Stream 的定義
- 支持順序和并行聚合操作的元素序列
- 可以由數(shù)組、集合以及文件轉(zhuǎn)換而成
- Stream 消費完之后便沒有了,就想流水一樣
- 生成流的“源”是一個不會在操作流的過程中改變
生成流的"姿勢"
- 數(shù)組生成流
Integer[] arr = {1, 2, 3, 4, 6};//這里可以開成int[] 試試看看結(jié)果。。。①
Stream.of(arr)//生成流Stream<Integer>
.forEach(System.out::println);//打印流中的每個元素
- 集合(list)生成流,Collection 接口已經(jīng)添加了stream 方法,即所有實現(xiàn)改接口的都可以生成流
Arrays.asList(1, 2, 3, 4)//返回list集合
.stream()//轉(zhuǎn)換為Stream<Integer>
.forEach(System.out::println);
- 讀文件生成流
Files.lines(Paths.get("E:\\temp\\test.txt"))
.forEach(System.out::println);
-
Stream 自帶生成無限流, Stream 類中的有兩個靜態(tài)方法來生成無限流
- 方法簽名:public static<T> Stream<T> generate(Supplier<T> s);Supplier<T> 是一個函數(shù)式接口,主要作用生產(chǎn)流中的元素
Stream.generate(() -> 1)
.limit(5)//
.forEach(System.out::println);
- 方法簽名:public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f);seed 就是初始值,UnaryOperator<T> 操作傳進來的參數(shù) 返回和參數(shù)相同的類型
Stream.iterate(5, i -> i + 1)//生成無線流
.limit(5)//使用limit 截斷流 這里取前5個,類比sql 的limit
.forEach(System.out::println);
上面兩個方法都是生成無限流,下面來講兩個個生成有限流的
- LongStream和IntStream的range()和rangeClosed() 方法,兩個方法的參數(shù)都是一樣:起始值和結(jié)束值,類型都是long或者int, 這兩個方法的區(qū)別是:range方法是不包括結(jié)束值,rangeClosed是包含結(jié)束值的。
@Test
public void streamRanged() {
IntStream.range(1, 2)
.forEach(System.out::println);
}
結(jié)果:
1
@Test
public void streamRangeClosed() {
IntStream.rangeClosed(1, 2)
.forEach(System.out::println);
}
結(jié)果:
1
2
大家歡迎指正批評
代碼地址