Stream数据流(Collection接口扩充)

  从JDK1.8发行的时候实际上就是世界上大数据兴起的时候,在整个大数据开发里面有一个最经典的模型就是:MapReduce 实际上这属于数据的两个操作阶段:

    Map:处理数据库。

    Reduce:分析数据。

  而在类集里面由于其本身的作用也可以进行大量数据的存储,所有就顺其自然的产生了MapReduce的操作,而这些操作通过Stream数据流来完成了。

Collection接口改进

  现在的Collection接口里面除了定义有一些抽象方法之外,也提供有一些普通方法,下面来观察这样的一个方法,下面观察这样的一个方法:

    forEach()输出支持:default void forEach(Consumer<? super T> action)

    取得Stream数据流对象:public default Stream<E> stream();

 1 package cn.Tony.demo;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class TestDemo{
 7     public static void main(String[] args) throws Exception {
 8         List<String> all=new ArrayList<String>();
 9         all.add("java");
10         all.add("python");
11         all.add("javascript");
12         all.add("jsp");
13         all.forEach(System.out::println);
14     }
15 }   

  这种只是进行一个现实,如果需要进更复杂的处理,还是使用Iterator比较容易一些

  但是在Collection接口里面提供有一个重要的Stream()方法,这个方法才是JDK1.8中数据操作的关键,

 1 package cn.Tony.demo;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.stream.Stream;
 6 
 7 public class TestDemo{
 8     public static void main(String[] args) throws Exception {
 9         List<String> all=new ArrayList<String>();
10         all.add("java");
11         all.add("python");
12         all.add("javascript");
13         all.add("jsp");
14         Stream<String> stream=all.stream();
15         System.out.println(stream.count());
16     }
17 }   

  将集合的数据交给了Stream流之后就相当于这些数据一个一个进行处理,而count()方法是做了一个数据的统计,整个流程还是出现了遍历的操作。

Stream 基本操作

  在之前使用的count()方法是针对于数据量做了一个统计的操作,除了这些之外,也可以进行数据的过滤。例如:满足于某些条件的内容才允许做数量通计。

范例:通计数据过滤

 1 package cn.Tony.demo;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.stream.Stream;
 6 
 7 public class TestDemo{
 8     public static void main(String[] args) throws Exception {
 9         List<String> all=new ArrayList<String>();
10         all.add("java");
11         all.add("python");
12         all.add("javascript");
13         all.add("jsp");
14         Stream<String> stream=all.stream();
15         //统计这些数据里面带有java的内容个数
16         System.out.println(stream.filter((e) ->e.contains("java")).count());
17     }
18 }   

  现在我不想要这些数据的个数,我希望得到具体那些数据通过了筛选,那么就可以使用一个收集器来完成。

 1 package cn.Tony.demo;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.stream.Collectors;
 6 import java.util.stream.Stream;
 7 
 8 public class TestDemo{
 9     public static void main(String[] args) throws Exception {
10         List<String> all=new ArrayList<String>();
11         all.add("java");
12         all.add("python");
13         all.add("javascript");
14         all.add("jsp");
15         Stream<String> stream=all.stream();
16         //统计这些数据里面带有java的内容个数
17         System.out.println(stream.filter((e) ->e.contains("java"))
18                 .collect(Collectors.toList()));//个数
19     }
20 }   

   收集完的数据你依然属于List集合,所以可以直接使用List进行接收。

    在Stream里面接口里面重点有两个操作方法:

      取出最大内容:Stream<T> limit(long maxSize)

      跳过的数据量:Stream<T> skip(long n) 

 1 package cn.Tony.demo;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.stream.Collectors;
 6 import java.util.stream.Stream;
 7 
 8 public class TestDemo{
 9     public static void main(String[] args) throws Exception {
10         List<String> all=new ArrayList<String>();
11         all.add("1.java");
12         all.add("2.python");
13         all.add("3.javascript");
14         all.add("4.jsp");
15         all.add("5.redis");
16         all.add("6.nginx");
17         all.add("7.sso");
18         Stream<String> stream=all.stream();
19         //统计这些数据里面带有java的内容个数
20         List<String> list=stream.skip(5).limit(2)
21                 .map((s)->s.toUpperCase())
22                 .collect(Collectors.toList());//把收集器结果给了List集合
23         System.out.println(list);
24     }
25 }   

   如果要进行分页的操作形式处理。而且使用map()函数还可以进行一些简单的数据操作

MapReduce模型

  MapReduce是整个Stream核心所在。可以这么说,之前的所有操作都只是做了一个MapReduce衬托 对于Mapreduce操作主要有两个阶段组成:

    map():指的是针对于数据进行先期的操作处理 例如:做一些简单的数学运算,

    reduce():是进行数据的统计分析。

范例:编写一个简单的数据统计操作 

 1 class Order{
 2     private String title;
 3     private double price;
 4     private int amount;
 5     public Order(String title, double price, int amount) {
 6         super();
 7         this.title = title;
 8         this.price = price;
 9         this.amount = amount;
10     }
11     public String getTitle() {
12         return title;
13     }
14     public void setTitle(String title) {
15         this.title = title;
16     }
17     public double getPrice() {
18         return price;
19     }
20     public void setPrice(double price) {
21         this.price = price;
22     }
23     public int getAmount() {
24         return amount;
25     }
26     public void setAmount(int amount) {
27         this.amount = amount;
28     }
29     
30 }

   随后在List集和里面保存这些订单的信息,肯定会有多个订单的信息存在。

原文地址:https://www.cnblogs.com/Tony98/p/10571030.html