Stream数据流

Posted skykuqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Stream数据流相关的知识,希望对你有一定的参考价值。

一.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本身提供的支持,而实际之中肯定不可能这样进行,因为所有的数据如果都保存在内存之中,那么面对与大数据的环境,系统无法承载...

以上是关于Stream数据流的主要内容,如果未能解决你的问题,请参考以下文章

Arduino基于Stream.h来处理Stream数据的相关库

JDK 8 Stream 数据流效率怎么样?

stream和parallelStream有啥区别

Stream数据流

JDK 8 Stream 数据流效率怎么样?

容器Stream