java8第五课:StreamAPI简介与入门

  这节课开始我们开始学Java8的另一个特性: Stream API

  首先说明,这玩意依然用的不多,但是,还是希望大家知道有这么个东西。

 

  什么是Stream API? 就是java8给我们提供了一个新的类叫Stream,这个类可以用来很方便的操作一组数据(集合、数组)。

 

  下面看代码:

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Random;

import java.util.stream.Stream;



public class Teach01 {



    public static void main(String[] args) {

        /**

         * 先来看看API文档。

         * 首先,既然StreamAPI是java8的新特性,所以看java1.6的API文档是看不到的,要看1.8的

         *

         * 先来看看创建流的几个方法吧:

         *

         * 1. Collection有个方法stream()可以用来创建流

         *

         * 2. Arrays.stream()静态方法

         *

         * 3. Stream.of()静态方法

         *

         * 4. 无限流

         *    通过Stream.iterate()或generat()方法产生无限流

         */



        //1. Collection有个方法stream()可以用来创建流

        List<String> list = new ArrayList<>();

        for (int i = 0; i < 10; i++) {

            list.add(String.valueOf(i));

        }



        //List是Collection的子接口,自然也有这个stream()方法

        Stream<String> stream1 = list.stream();



        //2. Arrays.stream()静态方法

        String[] strings = new String[]{"1","2","3"};

        Stream<String> stream2 = Arrays.stream(strings);



        //3. Stream.of()静态方法'

        Stream<Integer> stream3 = Stream.of(1, 2, 3);



        //4. 无限流

        //通过Stream.iterate()或generat()方法产生无限流



        /**

         * @param seed 种子

         *             此参数将会被作为第二个参数的未实现方法的参数然后不断被执行

         * @param f UnaryOperator类型

         *          UnaryOperator<T,T>继承Function<T,R>接口

         *          所以UnaryOperator中未实现的抽象方法为T apply(T t)

         *

         */

        Stream<Integer> stream4 = Stream.iterate(0, (t) -> { return t + 2; });

        /**

         * iterate原理类似如下

         *     List iterate(Object seed,UnaryOperator f)

         *     {

         *          List list = new ArrayList();

         *          Object i = seed;

         *          int count = 0;

         *          while(true)

         *          {

         *              //这个maxsize就是limit里的,如果不设置就会陷入死循环不断地生成数据

         *              if(count >= maxsize)

         *              {

         *                  break;

         *              }

         *              list.add(i);

         *              i = f.apply(i);

         *

         *          }

         *          return list;

         *     }

         *

         */



        /**

         * @Param s Supplier类型

         *            未实现的抽象方法为: T get();

         *        generate就是用哪个get()不断的产生数据,同样可以用limit()控制数量

         */

        Stream<Integer> stream5 = Stream.generate(() -> { return (new Random()).nextInt(); });



        /**

         * 接下来介绍常用方法:

         * 1. forEach

         *      @Param action Consumer类型

         *      未实现的方法为void accept(T t);

         *

         * 2. limit()

         *      @Param maxsize int

         *      限制流操作的数据的个数

         */

        //stream4.forEach(System.out::println);

        //无限生成,所以叫无限流

        stream4.limit(10).forEach(System.out::println);

    }

}

 

猜你喜欢

转载自blog.csdn.net/qq_40061421/article/details/84886630