Stream概述以及创建Stream对象

Stream是用来操作容器中的数据,例如过滤,映射,规约,排序,查找记录等等
Stream是和CPU打交道
集合关注的是数据的存储,是和内存打交道
总结:集合说的是数据,Stream说的是计算

注意:
①Stream 自己不会存储元素(数据),数据仍然是在集合当中。类似于迭代器,迭代器是用来遍历集合的,迭代器本身也不存数据,数据还是在集合当中。Stream关注的是对数据的运算
②Stream 不会改变源对象。相反,会返回一个持有结果的新Stream。即Stream具有不可变的特性
③Stream 操作是延迟执行的。(一个操作代表着一个方法,可以理解为每次调完之后就点一下,去调用方法,比如:过滤.映射.)对于中间操作来说,只要没有调用终止操作,中间操作都不执行,只有调用终止操作才会把中间操作都执行,也就是说是延迟执行的。这意味着会等到需要结果的时候才执行

Stream要想进行一些操作,要分成三个步骤
Stream操作的三个步骤
1) 创建 Stream的对象
一个数据源(如:集合、数组),获取一个流
根据数据源得到对应的Stream
2) 中间操作
一个中间操作链(即可以有多个中间操作),对数据源的数据进行处理
3) 终止操作(终端操作)
一旦执行终止操作,就执行中间操作链,并产生结果,如果不执行终止操作,中间操作链就不会执行。一旦产生结果以后就终止了,当前的Stream对象就不能再去点中间操作了,之后,不会再被使用。也就是说如果再想使用,又要从头再造Stream

Stream的实例化:

public class StreamAPITest {
    //创建 Stream方式一:通过集合
    //Java8中的Collection接口被扩展,提供了两个获取流的方法:
    //default Stream<E> stream() : 返回一个顺序流
    //default Stream<E> parallelStream() : 返回一个并行流
    @Test
    public void test1(){
        List<Employee> employees = EmployeeData.getEmployees();
        Stream<Employee> stream = employees.stream();//接口的默认方法要通过接口的实现类的对象去调用
        //顺序流:拿数据会按照集合中的顺序来

        System.out.println("***************************************");

        Stream<Employee> parallelStream = employees.parallelStream();
        //并行流:会同时的去取数据
    }


    //因为数组也是一种容器,所以还可以通过数组
    //创建 Stream方式二:通过数组
    //调用Arrays的 static <T> Stream<T> stream(T[] array): 返回一个流
    @Test
    public void test2(){
        int[] arr=new int[]{1,2,3,4,5,6};

        IntStream stream = Arrays.stream(arr);//因为我们给的是int[],所以返回的是IntStream
        // public static DoubleStream stream(double[] array)其他的基本类型同理
        //如果扔进去的是自定义类型数组,那么返回的就是Stream<自定义类型名>

        Employee e1=new Employee(1001,"Tom");
        Employee e2=new Employee(1002,"jerry");

        Employee[] arr1=new Employee[]{e1,e2};//这是静态初始化
        Stream<Employee> stream1 = Arrays.stream(arr1);//类型是通过Stream的泛型体现的


    }

    //创建Stream方式三:通过Stream的of()
    //of中可以写多个值,相当于构成一个容器,Stream对象就可以操作这个容器
    @Test
    public void test3(){

        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);//是看做包装类的对象

    }

    //创建 Stream方式四:创建无限流(用的比较少,了解即可,前面对应的多个数据都是有限的)
    //这里创建的是无限个元素对应的Stream
    @Test
    public void test4(){
        //迭代 public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
        //注意:UnaryOperator是函数式接口

        //遍历前10个偶数
        //0是初始值,返回的是t+2,但注意返回的t+2又会继续迭代,就会不停地加2,就不止10个了
        //想看效果要用到终止操作forEach(),里面要填Consumer,而println就是典型的放东西进去不出东西的例子
        //也可以写成Lambda表达式的形式,而下面是直接写成方法引用
        Stream.iterate(0,t->t+2).limit(10).forEach(System.out::println);//第二个参数继承了Function,Function是函数式接口,它是特殊的Function,一般的Function是T和R,而这个东西的apply方法放进去和返回的东西的类型都是T
        //上面的东西会一直输出,是停不下来的,所以确实是无限流,可以加上限制limit(10)只要前十个,这个东西也是中间操作




        // 生成 public static<T> Stream<T> generate(Supplier<T> s)
        //Supplier是不往里面放东西还出东西,典型的就是Math的random方法,因为这个方法是静态方法,所以要通过类来调用
        //输出10个随机数
        Stream.generate(Math::random).limit(10).forEach(System.out::println);

    }
}

输出结果为:

0
2
4
6
8
10
12
14
16
18
0.7994332036259181
0.8757405751180581
0.4900134823715929
0.5749140464545273
0.147323475304579
0.8053550561631083
0.4990720011692096
0.8312497979827275
0.9049172841130427
0.7791026058049584
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值