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集和里面保存这些订单的信息,肯定会有多个订单的信息存在。