目录
主要内容
一、主程序
二、工厂类
三、人员工厂类
四、执行结果
主要内容
MapReduce是一种编程模型,主要用在集群环境中大量机器处理的超大数据集。该模型有如下两种操作:
Map:把原始元素过滤转换为另一种更适合归约的形式。Reduce:在所有元素之上生成一个总计结果。比如,为数字生成总数、平均值、最大值、最小值。(sum、average、max、min、count)
一、主程序
package xyz.jangle.thread.test.n6_3.mapreduce;
import java.util.List;
import java.util.Optional;
import java.util.stream.DoubleStream;
import xyz.jangle.thread.test.n6_2.create.Person;
import xyz.jangle.thread.test.n6_2.create.PersonGenerator;
/**
* 6.3、归约流
*
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月2日 下午8:30:18
*
*/
public class M {
public static void main(String[] args) {
// Integer Double Long 对应的特有Stream
List<Double> numbers = DoubleGenerator.generateDoubleList(10000, 1000);
DoubleStream doubleStream = DoubleGenerator.generateStreamFromList(numbers);
long count = doubleStream.parallel().count();
System.out.println("doubleStream count:" + count);
doubleStream = DoubleGenerator.generateStreamFromList(numbers);
double sum = doubleStream.parallel().sum();
doubleStream = DoubleGenerator.generateStreamFromList(numbers);
double average = doubleStream.average().getAsDouble();
doubleStream = DoubleGenerator.generateStreamFromList(numbers);
double max = doubleStream.max().getAsDouble();
doubleStream = DoubleGenerator.generateStreamFromList(numbers);
double min = doubleStream.min().getAsDouble();
System.out.println("sum:" + sum + ",average:" + average + ",max:" + max + ",min:" + min);
// 第一种reduce方法(该方法需要符合结合律)
List<Point> points = PointGenerator.generatorPointList(10000);
Optional<Point> opt = points.parallelStream().reduce((p1, p2) -> {
Point point = new Point();
point.setX(p1.getX() + p2.getX());
point.setY(p1.getY() + p2.getY());
return point;
});
System.out.println("point:x:" + opt.get().getX() + "y:" + opt.get().getY());
// 第二种reduce方法(两个参数:1同一律值,2结合律)
List<Person> persons = PersonGenerator.generatePersonList(10000);
Integer salaryTotal = persons.parallelStream().map(p -> p.getSalary()).reduce(0, (s1, s2) -> s1 + s2);
System.out.println("SalaryTotal:" + salaryTotal);
// 第三种reduce方法(三个参数:1同一律值,2转换运算,3结合律)
Integer value = 0;
value = persons.parallelStream().reduce(value, (n, p) -> p.getSalary() > 10000 ? n + 1 : n,
(n1, n2) -> n1 + n2);
System.out.println("薪资大于10000的人数共:" + value+"人");
}
}
二、工厂类
package xyz.jangle.thread.test.n6_3.mapreduce;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.DoubleStream;
import java.util.stream.DoubleStream.Builder;
/**
* 随机Double列表工厂
*
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月2日 下午8:33:34
*
*/
public class DoubleGenerator {
/**
* 构造一个Double列表
*
* @author jangle
* @time 2020年9月2日 下午8:43:13
* @param size
* @param max
* @return
*/
public static List<Double> generateDoubleList(int size, int max) {
Random r = new Random();
ArrayList<Double> numbers = new ArrayList<Double>();
for (int i = 0; i < size; i++) {
double value = r.nextDouble() * max;
numbers.add(value);
}
return numbers;
}
/**
* 使用DoubleStream.Builder 来构造DoubleStream
*
* @author jangle
* @time 2020年9月2日 下午8:41:37
* @param list
* @return
*/
public static DoubleStream generateStreamFromList(List<Double> list) {
Builder builder = DoubleStream.builder();
for (Double number : list) {
builder.add(number);
}
return builder.build();
}
}
package xyz.jangle.thread.test.n6_3.mapreduce;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 坐标点 工厂
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月2日 下午8:45:11
*
*/
public class PointGenerator {
public static List<Point> generatorPointList(int size) {
List<Point> ret = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < size; i++) {
Point point = new Point();
point.setX(random.nextDouble());
point.setY(random.nextDouble());
ret.add(point);
}
return ret;
}
}
package xyz.jangle.thread.test.n6_3.mapreduce;
/**
* 坐标点
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月2日 下午8:43:59
*
*/
public class Point {
private double x, y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
三、人员工厂类
https://blog.csdn.net/Bof_jangle/article/details/108350870
四、执行结果
doubleStream count:10000
sum:5007948.66897734,average:500.794866897734,max:999.8224161683617,min:0.02690226598056622
point:x:5038.143851087914y:5036.672560286099
SalaryTotal:498853461
薪资大于10000的人数共:9031