- 创建流的方法有很多,常见的如:
- 从Collection集合创建
- 根据数值范围创建数值流
- 从一系列值
- 从数组
- 从文件
- 由函数来生成无限流
一、 从Collection集合
Stream<Integer> stream = new HashSet<Integer>() .stream(); Stream<String> stringStream = new ArrayList<String>() .stream();
二、 根据数值范围创建数值流
IntStream intStream = IntStream.rangeClosed(1, 100);
三、 从一系列值
- Stream提供了一个静态方法来根据一系列值生成一个流
Stream<Integer> integerStream = Stream.of(1, 2, 3); Stream<String> stringStream = Stream.of("喜欢", "天文", "的", "pony", "站长"); AppleStream apple = new AppleStream(); Stream<AppleStream> appleStream = Stream.of(apple, apple, apple);
四、 从数组
//重载了支持特定的基本类型流 IntStream intStream = Arrays.stream(new int[]{1, 2, 3}); LongStream longStream = Arrays.stream(new long[]{1L, 2L, 3L}); DoubleStream doubleStream = Arrays.stream(new double[]{1D, 2D, 3D}); Stream<String> stringStream = Arrays.stream(new String[]{"喜欢", "天文", "的", "pony", "站长"}); AppleStream apple = new AppleStream(); Stream<AppleStream> appleStream = Arrays.stream(new AppleStream[]{apple, apple, apple});
五、 从文件
- 准备文件
Stream<String> linesStream = Files.lines(Paths.get("fileStream.txt")); linesStream.forEach(System.out::println);
- 结果
六、由函数来生成无限流
- Java8提供了
Stream.iterate()
和Stream.generate()
来生成无限流,这两个方法会根据给定的表达式来生成包含无限个数据的流,所以一般结合limit()
来使用。
- 迭代:
Stream.iterate(T seed,Function<T, R> apply)
- 生成:
Stream.generate(Supplier<T> s)
// 给定一个初始值seed,和一个`接收一个入参,并带有返回值的函数` Stream.iterate(10, x -> x + 5) .limit(10) .forEach(System.out::println);
10 15 20 25 30 35 40 45 50 55
Random random = new Random(); // 接收一个 `无入参,有返回值` 的函数 Stream.generate(() -> random.nextInt(100)) .limit(10) .forEach(System.out::println);
60 56 6 61 7 30 97 64 26 54