05. Java8-流式API-创建流

逃离我推掉我的手 2022-02-02 01:29 317阅读 0赞

流可分为有限流和无限流两种, 有限流是指流中元素个数有限, 无限流指流中元素个数无限. 无论是有限流和无限流, 在进行终端操作之前都不会进行中间操作处理.

1. 有限流创建

1.1 通过集合创建流

通过list/set 自带的stream(), parallelStream() API可很方法的创建流.

  1. // 创建有限流1: 通过集合(list,set) 获取流, Map 不能获取流
  2. @Test
  3. public void createByListSet(){
  4. // 使用list 创建并行流
  5. List<String> list = new ArrayList<>();
  6. Stream<String> listParallelStream = list.parallelStream();
  7. // 使用set 创建串行流
  8. Set<String> set = new HashSet<>();
  9. Stream<String> setStream = set.stream();
  10. }

1.2 通过数组创建

数组可通过Arrays.stream()方法构建流, stream 方法有很多重载方法可用.

  1. // 创建有限流2: 通过数组创建流
  2. @Test
  3. public void createByArray(){
  4. String[] array = new String[3];
  5. Stream<String> arrayStream = Arrays.stream(array);
  6. long[] longArray = new long[3];
  7. LongStream longStream = Arrays.stream(longArray);
  8. int[] intArray = new int[3];
  9. IntStream intStream = Arrays.stream(intArray);
  10. double[] doubleArray = new double[3];
  11. DoubleStream doubleStream = Arrays.stream(doubleArray);
  12. }

1.3 通过Stream.of 创建

Stream.of 只能接收数组作为参数, 接收集合会把整个集合当做流中的一个元素.

  1. // 创建有限流3: 通过Stream.of 方法创建流,参数为数组
  2. @Test
  3. public void createByConstants(){
  4. Stream<String> stream = Stream.of("java", "Linux", "mysql", "nginx");
  5. Stream<String> stream2 = Stream.of(new String[]{ "a", "b", "c", "d"});
  6. stream.forEach(System.out::println);
  7. stream2.forEach(System.out::println);
  8. }

1.4 通过文件获取流

  1. // 创建有限流4: 通过文件获取流
  2. @Test
  3. public void createByFile() throws Exception{
  4. Stream<String> fileStream = Files.lines(Paths.get("pom.xml"));
  5. fileStream.forEach(System.out::println);
  6. }

2. 无限流创建

2.1 生成式创建

  1. // 创建无限流1: 生随机生产5个随机数
  2. @Test
  3. public void test_generate(){
  4. Stream<Double> stream = Stream.generate(Math::random).limit(5);
  5. stream.forEach(System.out::println);
  6. }

2.2 迭代式创建

迭代式创建类似于递归

  1. // 创建无限流2: 迭代式创建,(无限流通常需要配合limit使用,否则会无限创建)
  2. @Test
  3. public void test_iterate(){
  4. Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(5);
  5. stream.forEach(System.out::println);
  6. }
  7. //测试斐波那契数列
  8. @Test
  9. public void test_febinache(){
  10. Stream<Integer> stream = Stream
  11. .iterate(new int[]{ 0, 1}, t -> new int[]{ t[1], t[0] + t[1]})
  12. .limit(8)
  13. .map(t -> t[0]);
  14. stream.forEach(System.out::println);
  15. }

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读

    相关 09. Java8-API-并行

    Java8 中流的处理可以方便地在并行和串行之间切换, 并行流底层采用的是java7 特性fork/join 框架. 虽然并行流透明地使用了多线程, 但也并不是说是完美的, 并