流的创建主要分为四种:
- 由值创建流
- Stream.of()
- Stream stream = Stream.of(“Java”, “Lambda “); stream.map(String::toUpperCase).forEach(System.out::println);
- Stream.of()
- 由数组创建流
- Arrays.stream()
- int[] numbers = {1,2, 3, 4, 5,}; int sum = Arrays.stream(numbers).sum();
- Arrays.stream()
- 由文件生成流
- Stream lines(Path path)
- 由函数生成流:创建无限流
- Stream.iterate和Stream.generate
- iterate
- iterate方法接受一个初始值(在这里是0),还有一个依次应用在每个产生的新值上的Lambda(UnaryOperator类型)
- generate
- 接受一个Supplier类型的Lambda提供新的值
- iterate
- Stream.iterate和Stream.generate
我们来看代码:
import java.util.function.IntSupplier;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* 创建流
*/
public class StreamTest6 {
public static void main(String[] args) {
System.out.println("iterate生成流");
Stream.iterate(0, n ->n+2)
.limit(10)
.forEach(System.out::println);
System.out.println("iterate以数据交换的方式生成斐波那契流");
Stream.iterate(new int[]{0,1}, n ->{
//这里是用原数组替换值的方式,不断递增向后生成数列
int sum = n[0]+n[1];
n[0] = n[1];
n[1] = sum;
return n;
}).limit(10)
.forEach(t -> System.out.println("(" + t[0] + "," + t[1] +")"));
System.out.println("iterate以流的方式生成斐波那契流");
Stream.iterate(new int[]{0,1}, n ->new int[]{n[1],n[1]+n[0]})
.limit(10)
.forEach(n -> System.out.println("(" + n[0] + "," + n[1] +")"));
//generate
System.out.println("generate生成流");
IntStream.generate(new IntSupplier(){
@Override
public int getAsInt() {
return 5;
}
}).limit(10)
.forEach(System.out::println);
}
}
输出结果:
iterate生成流
0
2
4
6
8
10
12
14
16
18
iterate以数据交换的方式生成斐波那契流
(0,1)
(1,1)
(1,2)
(2,3)
(3,5)
(5,8)
(8,13)
(13,21)
(21,34)
(34,55)
iterate以流的方式生成斐波那契流
(0,1)
(1,1)
(1,2)
(2,3)
(3,5)
(5,8)
(8,13)
(13,21)
(21,34)
(34,55)
generate生成流
5
5
5
5
5
5
5
5
5
5