十、Stream流

一、简介

  • Java 8引入的新特性;
  • Stream流不会存储数据;
  • Stream流不会改变源数据,只是将数据转换为元素序列;
  • Stream流可以将流中的数据再次转换为数据;
  • Stream流是延迟加载的,这意味着它在需要的时候才会去加载

二、基本使用

  • 创建Stream:从一个数据源(集合,数组)中获取流;
  • 中间操作: 一个中间操作链,对数据源的数据进行操作;
  • 终止操作: 一个终止操作,终止链式操作;

1. 基本三步骤

  • 创建;
  • filter();
  • skip();
  • limit();
  • distinct();
public class StreamFirst {

    List<Student> list = Arrays.asList(new Student("张三",18,"陕西"),
            new Student("李四",23,"山西"),
            new Student("王五",34,"河北"),
            new Student("张三丰",20,"河南"),
            new Student("张三丰",20,"河南"),
            new Student("张三丰",20,"河南"));



    @Test
    public void firstMethod(){
        /** 1. 通过Collection集合接口的  :Stream<E> stream()
         *     适用于List,Set,  Map接口可以转换为List和Set
         */
        Stream<Student> streamList = list.stream();

        /** 2. 通过Arrays的方法 :  stream(T[] array)
         *     用来将数组转换为流
         */
        String[] strArr= {"张三","李四","王五","赵六"};
        Stream<String> streamArr = Arrays.stream(strArr);

        /**
         * 3. 通过Stream中的静态方法: static<T> Stream<T> of(T t)
         */
        Stream<String> streamStream = Stream.of(strArr);
    }

    /** 中间操作 及  终止操作
     */
    @Test
    public void secondMethod(){
        /** filter():   Stream<T> filter(Predicate<? super T> predicate);
         *  过滤             Predicate:  boolean test(T t);
         */
        List<Student> list = this.list.stream().filter(element -> {
            return element.getAge() > 20;
        }).collect(Collectors.toList());
        System.out.println(list);
    }

    @Test
    public void thirdMethod(){
        /** skip():     Stream<T> skip(long n);
         *  跳过
         */
        List<Student> list = this.list.stream().skip(2).collect(Collectors.toList());
        System.out.println(list);
    }

    @Test
    public void fourthMethod(){
        /** skip():     Stream<T> limit(long maxSize);
         *  跳过
         */
        List<Student> list = this.list.stream().limit(2).collect(Collectors.toList());
        System.out.println(list);
    }

    @Test
    public void FifMethod(){
        /** distinct():   Stream<T> distinct();
         *  去重: 必须重写对象的hashCode和equals方法
         */
        List<Student> list = this.list.stream().distinct().collect(Collectors.toList());
        System.out.println(list);
    }

}

2. 惰性求值

  • 惰性求值;
  • 内部迭代;
public class StreamFirst {

    List<Student> list = Arrays.asList(new Student("张三",18,"陕西"),
            new Student("李四",23,"山西"),
            new Student("王五",34,"河北"),
            new Student("张三丰",20,"河南"),
            new Student("张三丰",20,"河南"),
            new Student("张三丰",20,"河南"));

    @Test
    public void firstMethod(){
        /** 1. 惰性加载: 流会一次性将所有的条件执行完毕后,终止操作后才会运行
         *  2. 内部迭代: 迭代是在流内部进行,所以成为内部迭代;
         *  3. 所以下面操作没有遇见终止操作,因此流并不会执行
         */
        Stream<Student> stream = list.stream().filter(element -> {
            System.out.println("迭代");
            return element.getAge() > 20;
        }).limit(2);
    }

    @Test
    public void secondMethod(){
        /** 1. 短路:当limit选项满足了一定条件后,就不再去走内部迭代;
         *  2. 短路思想一定程度上提升了效率
         * 
         */
        List<Student> list = this.list.stream().filter(element -> {
            System.out.println("短路");
            return element.getAge() > 0;
        }).limit(2).collect(Collectors.toList());
        System.out.println(list);
    }
}

3. map

public class StreamFirst {

    List<Student> list = Arrays.asList(new Student("张三",18,"陕西"),
            new Student("李四",23,"山西"),
            new Student("王五",34,"河北"),
            new Student("张三丰",20,"河南"),
            new Student("张三丰",20,"河南"),
            new Student("张三丰",20,"河南"));

    @Test
    public void firstMethod(){
        /**
         * map(): 将流中每个对象拿出来,然后进行操作
         * Stream<R> map(Function<? super T, ? extends R> mapper);
         * 取出每个对象,然后给每个对象的年龄加10
         */
        List<Object> list = this.list.stream().map(element -> {
            element.setAge(element.getAge() + 10);
            return element;
        }).collect(Collectors.toList());

        System.out.println(list);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值