Java8:Stream内reduce()方法的一点个人理解

该方法有三个重载,稍微有点复杂,直接上代码了

    @Test
    public void demoReduce(){
        //取出out
        PrintStream out=System.out;
        //实现Predicate接口并且指定行为:传入的参数中是否包含字符串"a"
        //后续可以调用该接口的test方法做筛选判断
        Predicate<String> predicate=x->x.contains("a");

        out.println("单个参数的reduce方法->接收BinaryOperator函数返回一个Optional<T>类型\n" +
            "实际上,该方法此时的表现为将该序列(Stream流内的类型)\n" +
            "的第一个元素与该流后续所有元素做2合计算'比如:(a[0]+a[1])+a[3]'\n" +
            "执行完函数后获得一个Optional<T>类型(可选的,任意的)后调用get()方法进行取值");
        Stream<Integer> stream2=Stream.of(1,2,3);
        //输出结果为6
        out.println(stream2.reduce((x,y)->x*y).get());

        out.println("两个参数1reduce方法实际上只是多了一个初始化的值‘T’\n" +
            ",第二个参数与单参方法一致,该重载方法返回类型为‘T’,指通过BinaryOperator进行计算后\n" +
            "返回一个类型与初始化参数的类型一致的值:::重点->双参函数与单参的计算流程不同:\n" +
            "该函数是将初始化参数与流内所有的元素逐个进行二和运算,\n" +
            "下面实例为将所有包含'a'的元素拼接在初始化参数的后面");
        Stream<String> stream3=Stream.of("as1","a12","nmm1","cc2","ac3","ab4");
        //输出结果为[valueMain]:as1a12ac3ab4
        out.println(stream3.reduce("[valueMain]:",(x,y)->{if(predicate.test(y))return x.concat(y);else return x;}));

        out.println("初始化参数为一个集合,将流内所有符合条件的元素筛选出来加入到该初始参数中");
        Stream<String> stream=Stream.of("as","ai","nmm","cc","ac","ab");
        //输出结果为:as ai ac ab
        stream.reduce(new ArrayList<String>(),(x,y)->{if (predicate.test(y)) x.add(y);return x;},(x,y)->x).forEach(System.out::println);

        out.println("并行(parallel)的影响下,第三个参数才会生效\n" +
            "该状态下理解为第二个函数根据流内数据的个数分为多线程去处理每个值与首参U的2合计算\n" +
            "首参U分别与流内每个值计算完毕后,由第三个参数对这些值做出整合(该参数要求实现\n" +
            "BinaryOperator接口并给出一个单值计算的行为),即,\n" +
            "该接口内三个参数为同一类型,并作出操作(T x,T y)->{return ?(T)}");
        Stream<Integer> stream1=Stream.of(1,2,3);
        //输出结果为:1716   (10+1)*(10+2)*(10+3)
        out.println(stream1.parallel().reduce(10,(x,y)->x+y,(x,y)->x*y));

        out.println("非并行情况下的第三个参数BinaryOperator " +
            "combiner(合成器)\n会对第二个参数BiFunction accumulator(累加器) 产生什么影响?\n" +
            "会对该函数运行结果产生什么影响?\n" +
            "答案是:第三个参数无效。\n" +
            "符合预期的说法:非并行情况下第三个参数根本就不需要,不会对该函数产生任何影响\n" +
            "Debug:该函数执行完第二个参数后直接停止运行,根本没有访问到第三个参数去执行");
        Stream<Integer> stream4=Stream.of(1,2,3);
        //输出结果为16     10+1+2+3
        out.println(stream4.reduce(10,(x,y)->x+y,(x,y)->x*y));
    }

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值