zoukankan      html  css  js  c++  java
  • 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集和里面保存这些订单的信息,肯定会有多个订单的信息存在。

  • 相关阅读:
    Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded
    Docker配置LNMP环境
    Docker安装mysqli扩展和gd扩展
    Docker常用命令
    Ubuntu常用命令
    单例模式的优缺点和使用场景
    ABP 多租户数据共享
    ABP Core 后台Angular+Ng-Zorro 图片上传
    ERROR Error: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' in ngModelOptions.
    AbpCore 执行迁移文件生成数据库报错 Could not find root folder of the web project!
  • 原文地址:https://www.cnblogs.com/Tony98/p/10571030.html
Copyright © 2011-2022 走看看