5.5.3 Java流:一个一个地提供数据

Java Map-Reduce(映射-归总) 中说明:要使用Map-Reduce模型,就需要设计一种替代List的结构,该结构对数据序列的供给过程和使用过程交替进行,即每提供一个元素就进行过滤和累积;

本文的目的就是演示流如何使供给过程和使用过程交替进行。心里记住传统循环就是一个一个地提供数据的。

 

    public static long sum(long a, long b) {
        long result = 0;
        for (long i = a; i <= b; i++) {
            if (util.MyMath.isPrime(i)) { 
                result += i;
            }
        }
        return result;
    }

下面代码的功能:首先创建无穷流{0,1,2,3,…},映射成{2,3,4…},过滤掉偶数,过滤出素数,截取前5个,并将元素打印出来。

 

直接写出结果很简单:

 

    public static void oneByOne_1() {
        Stream.iterate(0L, x -> x + 1)
                .map(x -> x + 2)
                .filter(x -> (x % 2 != 0))
                .filter(x -> util.MyMath.isPrime(x))
                .limit(5)
                .forEach(x -> p(x + " "));
}

我们需要在各个lambda表达式中添加打印语句,并仔细阅读打印的内容。

 

 

    public static void oneByOne() {
        Stream<Long> stream = Stream.iterate(0L, x -> {
            long r = x + 1;
            pln("iterate :数据 =" + r);
            return r;
        });
        Stream<Long> stream1 = stream.map(x -> {
            long r = x + 2;
            pln("map :数据 =" + r);
            return r;
        });
        Stream<Long> stream2 = stream1.filter(x -> {
            boolean b =(x % 2 != 0);
            String s = b?"保留":"滤掉";
            pln("filter_奇数 :" + x +" "+ s);
            return b;
        });
        Stream<Long> stream3 = stream2.filter(x -> {
             boolean b =util.MyMath.isPrime(x);
            String s = b?"保留":"滤掉";
            pln("filter_素数 :" + x +" "+ s);
            return b;
        });
        pln("--------------------limit(10)");
        Stream<Long> stream4 = stream3.limit(10);
        stream4.forEach(x -> pln("打印数据:"+x));
    }

输出很长,

 

--------------------limit(10)
map :数据 =2
filter_奇数 :2 滤掉
iterate :数据 =1
map :数据 =3
filter_奇数 :3 保留
filter_素数 :3 保留
打印数据:3
iterate :数据 =2
map :数据 =4
filter_奇数 :4 滤掉
iterate :数据 =3
map :数据 =5
filter_奇数 :5 保留
filter_素数 :5 保留

打印数据:5

...

 

 2.peek/窥视

在lambda中添加打印语句,方便我们观察程序的执行,但是将oneByOne()中用于调试的代码去掉,修改成oneByOne_1()就比较麻烦。
peek不改变流的任何元素,仅用于查看提供的元素。例如
 

    public static void peektest() {
        Stream.iterate(0L, x -> x + 1).peek(x->pln("iterate :数据 =" + x))
        .map(x -> x + 2).peek(x->pln("map :数据 =" + x))
        .filter(x -> (x % 2 != 0)).peek(x->pln("filter_奇数 :" + x))
        .filter(x -> Util.isPrime.test(x)).peek(x->pln("filter_素数 :" + x))
        .limit(5)//.peek(x->pln("limit" + x))
        .forEach(x -> pln("打印数据:"+x));
    }

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值