一.Stream数据流
从JDK1.8开始,由于已经进入到了大数据的时代,所以在类集里面也支持有数据的分析处理操作(数据的流式分析处理操作),为此就专门提供了一个Stream的接口,同时在Collection接口里面也提供有为此接口实例化的方法:
并行流式分析:default Stream<E> parallelStream() 多个线程共同参与分析
单一线程分析: default Stream<E> stream()
--Stream接口的基础操作
Stream的主要功能是进行数据的分析处理,同时主要是针对于集合中的数据进行分析操作.
1 public class MyCollectionsDemo {
2 public static void main(String[] args) {
3 List<String> all = new ArrayList<>();
4 //追加元素
5 Collections.addAll(all, "python", "c++", "java", "Go", "Ruby");
6 Stream<String> stream = all.stream(); //实例化Stream对象
7 // System.out.println(stream.count()); //输出元素的个数
8 //其最大的好处是可以根据函数式编程实现数据的流式处理
9 //例如需要获取集合中带有字母G的元素
10 // 将每一个字母都转变为小写字母,并且判断字母是否存在
11 long count = stream.filter((ele) -> ele.toLowerCase().contains("j")).count();//断言型的函数式接口
12 System.out.println(count);
13 }
14 }
--但是以上的程序只是实现了一些最基础的数据的个数的统计,而更多情况下时获取里面的满足条件的数据内容,因此此时可以实现数据的采集操作:
--范例:数据采集
1 public class MyCollectionsDemo {
2 public static void main(String[] args) {
3 List<String> all = new ArrayList<>();
4 //追加元素
5 Collections.addAll(all, "python", "c++", "java", "Go", "Ruby");
6 Stream<String> stream = all.stream(); //实例化Stream对象
7 //将满足条件的数据收集起来转化为List集合
8 List<String> list = stream.filter((ele) -> ele.toLowerCase().contains("j")).collect(Collectors.toList());//断言型的函数式接口
9 System.out.println(list);
10 }
11 }
--在Stream数据流处理的过程中,还允许进行数据的分页处理,提供有两个方法:
设置取出的最大的数据量: Stream<T> limit(long maxSize)
跳过指定数据量: Stream<T> skip(long n)
1 public class MyCollectionsDemo {
2 public static void main(String[] args) {
3 List<String> all = new ArrayList<>();
4 //追加元素
5 Collections.addAll(all, "python", "c++", "java", "Go", "Ruby","jsp","json","html","css");
6 Stream<String> stream = all.stream(); //实例化Stream对象
7 //将满足条件的数据收集起来转化为List集合
8 List<String> list = stream.filter((ele) -> ele.toLowerCase().contains("j")).skip(1).limit(2).collect(Collectors.toList());//断言型的函数式接口
9 System.out.println(list);
10 }
11 }
--运行结果
[jsp, json]
Process finished with exit code 0
-此时其逃过了第一个收集到的数据"java",输出了之后获取到的两个数据.Stream的操作主要是利用自身的特点实现数据的分析处理操作.
二.MapReduce基础模型
在进行数据分析的处理之中,有一个最重要的基础模型,那就是MapReduce模型,对于这个模型,一共是分为两个部分,一个是Map处理部分,第二个是Reduce分析部分.在进行数据分析之前,必须要对数据进行合理的处理,而后才可以做统计分析操作.
1 package 类集合框架.集合工具类;
2
3 import java.util.ArrayList;
4 import java.util.DoubleSummaryStatistics;
5 import java.util.List;
6 import java.util.stream.Stream;
7
8 /**
9 * @author : S K Y
10 * @version :0.0.1
11 */
12 class Order{ //订单信息
13 private String name; //购买的商品的名称
14 private double price; //商品的单价
15 private int amount; //商品的数量
16
17 public Order(String name, double price, int amount) {
18 this.name = name;
19 this.price = price;
20 this.amount = amount;
21 }
22
23 public String getName() {
24 return name;
25 }
26
27 public double getPrice() {
28 return price;
29 }
30
31 public int getAmount() {
32 return amount;
33 }
34 }
35 public class MyMapReduceDemo {
36 public static void main(String[] args) {
37 //如果要想使用Stream进行分析处理,则一定要将全部分析的数据保存在集合之中
38 List<Order> all = new ArrayList<>();
39 all.add(new Order("小娃娃",9.9,10));
40 all.add(new Order("电动变形金刚",999.9,2));
41 all.add(new Order("笔记本电脑",8999.9,4));
42 all.add(new Order("茶杯",2.9,200));
43 all.add(new Order("电动茶具",112.9,100));
44 //统计分析够爱商品之中带有电的产品,并且进行单价和数量的处理随后分析汇总
45 DoubleSummaryStatistics statistics = all.stream().filter(order -> order.getName().contains("电"))
46 .mapToDouble(value -> value.getPrice() * value.getAmount()).summaryStatistics();
47 System.out.println("商品购买种类数量: " + statistics.getCount());
48 System.out.println("商品购买总价: " + statistics.getSum());
49 System.out.println("商品平均花费: " + statistics.getAverage());
50 System.out.println("商品最高花费: " + statistics.getMax());
51 System.out.println("商品最低花费: " + statistics.getMin());
52 }
53 }
--运行结果
商品购买种类数量: 3
商品购买总价: 49289.4
商品平均花费: 16429.8
商品最高花费: 35999.6
商品最低花费: 1999.8
Process finished with exit code 0
--这些分析操作只是JDK本身提供的支持,而实际之中肯定不可能这样进行,因为所有的数据如果都保存在内存之中,那么面对与大数据的环境,系统无法承载...