Stream是从JDK8之后提供的一种数据流的分析操作标准,可以利用其与Lambda表达式结合进行数据统计操作。
1、使用Stream进行数据采集的例子:
package com.mydemo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
public class StreamDemo {
public static void main(String[] args) {
// 实例化List集合
List<String> all = new ArrayList<>();
// 集合数据保存
Collections.addAll(all, "java", "sql", "nginx", "tomcat", "html", "css", "js");
// 获取Stream接口对象
Stream<String> stream = all.stream();
/**
* 将每一个元素全部变为小写字母,
* 而后查询是否存在字母"j",
* 如果存在则进行个数统计
*/
System.out.println(stream.filter(
(e) -> e.toLowerCase().contains("j")
).count()
);
}
}
运行结果:
2
MapReduce是一种分布式计算模型,最初由谷歌提出,主要用于搜索领域,解决海量数据的计算问题。在MapReduce模型中一共分为两个部分:
- map(数据处理)
- reduce(统计计算)
2、使用Stream实现MapReduce数据分析的例子:
package com.mydemo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.DoubleSummaryStatistics;
import java.util.List;
public class StreamDemo {
public static void main(String[] args) {
/**
* 如果要想使用Stream进行分析处理,
* 则一定要将全部要分析的数据保存在集合中
*/
List<Order> all = new ArrayList<>();
// 集合数据保存
Collections.addAll(all, new Order("y商品1", 20.00, 5));
Collections.addAll(all, new Order("y商品2", 50.00, 55));
Collections.addAll(all, new Order("商品3", 60.00, 35));
Collections.addAll(all, new Order("y商品4", 70.00, 25));
Collections.addAll(all, new Order("y商品5", 90.00, 15));
/**
* 分析购买商品中带有"y"的数据信息,
* 并且进行商品单价和数量的处理,
* 随后分析汇总
*
* 在jdk8中,有summaryStatistics()流方法,
* 我们可以根据此方法获取到集合中的最大值,最小值,和,平均值信息。
*/
DoubleSummaryStatistics statistics = all.stream().filter(
// 数据过滤
(e) -> e.getName().toLowerCase().contains("y")
).mapToDouble( // 获取订单数据
(orderObject) -> orderObject.getPrice() * orderObject.getAmount()
).summaryStatistics(); // 获取统计对象
System.out.println("购买数量:" + statistics.getCount());
System.out.println("购买总价:" + statistics.getSum());
System.out.println("平均花费:" + statistics.getAverage());
System.out.println("最高花费:" + statistics.getMax());
System.out.println("最低花费:" + statistics.getMin());
}
}
class Order {
private String name;
private double price;
private int amount;
/**
* 三参构造方法
*
* @param name
* @param price
* @param amount
*/
public Order(String name, double price, int amount) {
this.name = name;
this.price = price;
this.amount = amount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
}
运行结果:
购买数量:4
购买总价:5950.0
平均花费:1487.5
最高花费:2750.0
最低花费:100.0