Java Stream流(详解)

本文详细介绍了Java Stream流的概念,从引入需求出发,讲解了Stream流的格式、获取流的方式,以及常用的过滤、映射、限制等操作方法,并通过实例演示了如何使用Stream流处理集合。最后,讨论了如何将Stream流中的数据收集到不同类型的集合中。
摘要由CSDN通过智能技术生成

一、Stream流引入

        Lambda表达式,基于Lambda所带来的函数式编程,又引入了一个全新的Stream概念,用于解决集合类库既有的鼻端。(Lambda表达式详解在上篇博客内容)

        现有一个需求:

                将list集合中姓张的元素过滤到一个新的集合中

                然后将过滤出来的姓张的元素中,再过滤出来长度为3的元素,存储到一个新的集合中

                1.用常规方法解决需求

        // 已知的知识来解决需求
        List<String> list1 = new ArrayList<>();
        list1.add("张老三");
        list1.add("张小三");
        list1.add("李四");
        list1.add("赵五");
        list1.add("张六");
        list1.add("王八");

        ArrayList<String> list2 = new ArrayList<>();
        // 1.将list集合中姓张的元素过滤到一个新的集合中
        for(String name : list1){
            if(name.startsWith("张")){
                list2.add(name);
            }
        }
        ArrayList list3 = new ArrayList();
        for (String name : list2) {
            if (name.length() == 3){
                list3.add(name);
            }
        }
        System.out.println(list3);

        输出结果:
            [张老三, 张小三]

              2.用Stream流操作集合,获取流,过滤操作,打印输出

list1.stream().filter((String name)->name.startsWith("张")).filter((String name)->name.length()==3).forEach((String name)->{
            System.out.println("符合条件的姓名:" + name);
        });

                ( 看不懂没关系,下面会讲到该方法,这里只是用来引入的)

二、Stream流的格式

Stream<T> filter(Predicate<? super T> predicate);
            -----> 参数:public interface Predicate<T>  (函数式接口)
                    ----> 抽象方法:boolean test(T t);
            -----> 参数:public interface Consumer<T>  (函数式接口)
                    ----> 抽象方法:boolean test(T t);

     整体代码看来:流式思想 类似于 工厂车间的“流水线”

                ( 看不懂没关系,下面会讲到该方法,这里只是用来引入的)

三、获取流

        根据集合来获取:

                根据Collection获取流:

                        Collection接口中有一个stream()方法,可以获取流

        default Stream<E> stream()

                1.根据List获取流

                2.根据Set获取流

                3.根据Map获取流

                        3.1根据Map集合的键来获取流

                        3.2根据Map集合的值获取流

                        3.3根据Map集合的键值对对象获取流

                4.根据数组获取流

        代码演示:

                1.根据List集合获取流

        // 创建List集合
        List<String> list = new ArrayList<>();
        list.add("张老三");
        list.add("张小三");
        list
Java 8 引入了一种新的抽象概念 Stream),它使得对数据的处理变得更加简便和高效。Stream 是一种来自数据源的元素队列并支持聚合操作。 Stream API 借助于lambda表达式,极大的提高了Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。 Stream 的特性可以归纳为: - 不是数据结构 - 没有存储元素 - 支持延迟计算 - 支持并行处理 Stream 的操作分为中间操作和终止操作。中间操作会返回一个新的 Stream,我们可以对这个新的 Stream 进行下一步的操作。终止操作则会返回一个最终的结果。 Stream 操作可以分为以下几种: - Intermediate(中间)操作:一个可以后面跟随零个或多个Intermediate操作。其目的主要是打开,做出某种程度的数据映射/过滤,然后返回一个新的,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始的遍历。 - Terminal(终止)操作:一个只能有一个 Terminal 操作,当这个操作执行后,就被使用“光”了,无法再被操作。所以这必定是的最后一个操作。Terminal 操作的执行,才会真正开始的遍历,并且会生成一个结果,或者一个 side effect。 Stream API 提供了大量的方法,可以用来完成各种不同的操作,如过滤、映射、筛选、查找、归约等等。这些方法可以分为以下几类: - 转换操作:map、flatMap、filter、distinct、sorted、peek、limit、skip - 聚合操作:forEach、reduce、collect - 匹配操作:allMatch、anyMatch、noneMatch - 查找操作:findFirst、findAny - 统计操作:count、min、max、average、sum Stream API 的使用可以大大简化代码,增加可读性和可维护性。同时,由于它的并行特性,可以有效地提升程序的性能。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值