关于java中Steam流的探索

  • Post author:
  • Post category:java


为了更好利用java提供的各种东西,今天在这里对Stream进行探索。

在日常开发中肯定是少不了对于集合的操作,无论是创建的查所有、求和、求最值等都需要涉及到集合,这个时候我通常都是套上for循环代码比较繁琐。

这个时候java流就登场了,使用Stream让开发更高级更快捷。

Stream就是对于集合进行想要的操作,例如求和、求最值、筛选、映射、取出想要的内容等。

Stream的操作一般分为三个步骤:1、创建流;2、执行中间操作,也就是进行筛选、映射等操作;3、执行终端操作,将处理好的数据从流里面取出来,以供我们使用。


中间操作

一个流可以后面跟随零个或者多个中间操作。其目的主要是为了打开流,做出某种程度的数据映射/过滤,然后再返回一个新的流,交给下一个流使用。这类操作都是惰性化的,仅仅调用到这类方法,并没有开始真正的流的遍历,真正的遍历要等到终端操作的时候。常见的中间操作有:filter 过滤、map 流映射等。


终端操作



一个流有且只能有一个终端操作,当这个操作执行后,流就被关闭了,无法在进行操作。因此一个流只能被遍历一次,若要再遍历需要通过数据源再生成一次流。终端操作的执行才会真正开始流的遍历,也就是去获取我们想要的数据。如count、collect

介绍完基础概念后就让我们开始流的使用吧


filter 筛选过滤



使用filter方法进行条件筛选,filter的方法参数为一个条件(过滤保留函数返回值为true的元素)。

代码案例:

        // 筛选过滤掉小于5的部分
        List<Integer> integers = Arrays.asList(1, 2, 4, 5, 6, 7, 8, 9, 10);
        Stream<Integer> integerStream = integers.stream().filter(i -> i >= 5);
        integerStream.forEach(i -> System.out.println(i));

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

        // 寻找名字长度大于3的部门
        List<String> names = Arrays.asList("alice", "bob", "jack", "rose");
        Stream<String> stringStream = names.stream().filter(i -> i.length() > 3);
        stringStream.forEach(i -> System.out.println(i));

        // distinct 去重,通过distinct方法快速去除重复的元素
        List<String> names = Arrays.asList("jack", "jack", "alice", "alice", "tom", "tom");
        Stream<String> nameStream = names.stream().distinct();
        nameStream.forEach(i -> System.out.println(i));

        // limit 返回指定流个数,注意 limit() 方法的参数一定要 >= 0 否则会抛出异常
        List<Integer> maths = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
        Stream<Integer> mathStream = maths.stream().limit(5);
        mathStream.forEach(i -> System.out.println(i));

        // skip 跳过几个元素,在一个流中跳过n个元素,且 n>=0
        List<Integer> maths = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
        Stream<Integer> mathStream = maths.stream();
        Stream<Integer> skipStream = mathStream.skip(4);
        skipStream.forEach(i -> System.out.println(i));

        // map 流映射,所谓流映射就是将接受的元素映射为另一种元素, 就像从人群中获取人的身高信息,一个人肯定不止有身高这么一种信息
        // 接下来演示将 String -> Integer 的过程
        List<String> names = Arrays.asList("alice", "bob", "jack", "rose");
        List<Integer> collect = names.stream()
                .map(String::length)
                .collect(Collectors.toList());
        collect.forEach(i -> System.out.println(i));

        // flatMap 流转换,将一个流中每个值转换为另一流
        // 将主角的名字们按" "分隔,使用flatMap()方法形成新的流,去除重复项获取到主角名字的单词 word,完成了 stream -> strem 的转换
        List<String> figures = Arrays.asList("lu ming fei", "chen mo tong", "shang shan hui li yi", "yuan zhi sheng", "yuan zhi nv");
        Stream<String> figureStream = figures.stream();
        List<String> word = figureStream
                .map(figure -> figure.split(" "))
                .flatMap(Arrays::stream)
                .distinct()
                .collect(Collectors.toList());
        word.forEach(i -> System.out.println(i));

// anyMatch:是否匹配任一元素,anyMathch用于判断流中是否存在至少一个满足条件的元素,这个判断条件通过lambda表达式传递给anyMatch,执行结果为boolean类型
        // 我个人感觉一般用于条件判断,例如在执行更复杂的业务前进行判断,如果没有执行的比较就跳过,例如vip
        // 例如这个例子,夏县中学普通班立有一个同学考上二本,那么说明今年这个普通班的班主任及各科老师很负责
        List<Integer> results = Arrays.asList(283, 295, 387, 403,411, 299, 390);
        Stream<Integer> resultStrem = results.stream();
        if(resultStrem.anyMatch(i -> i >= 417)){
            System.out.println("这个夏中普通班的老师很负责!");
        }else{
            System.out.println("这个夏中普通班的学生太皮,老师太懒。");
        }



版权声明:本文为hX_sunmer原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。