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));
}