一、Collection接口的改進javascript
在Iterable接口裏面定義有一個簡單的輸出:default void forEach(Consumer<? super T> action)。 也就是說若是要想進行迭代處理,沒有必要去強制使用Iterator完成了。java
使用Lamda操做forEach()方法和直接採用方法引用jquery
範例:ajax
package cn.demo; import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; public class Test { public static void main(String[] args) throws Exception { List<String> all = new ArrayList<String>(); all.add("hello"); all.add("word"); all.forEach((e) -> {System.out.println(e);}); all.forEach(System.out :: println); } }
結果:json
hello
word
hello
wordapp
***************************************************************************************************************************jsp
在整個Collection接口裏面有一個取得Stream接口對象的方法:default Stream<E> stream();ide
範例:函數
1 package cn.demo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.stream.Stream; 6 7 public class Test { 8 public static void main(String[] args) throws Exception { 9 10 List<String> all = new ArrayList<String>(); 11 all.add("hello"); 12 all.add("word"); 13 Stream<String> stream = all.stream(); 14 System.out.println(stream.count()); 15 } 16 }
結果:2工具
總結:此時取得了一個長度。功能和size()相同,可是它是直接取得了內存中的要分析的數據量。
二、Stream操做
Stream至關因而全部數據的流式數據分析工具,既然是數據的分析,那麼就須要對數據執行一些簡單的操做,例如:可能須要一些過濾,即:知足一些條件以後的數據能夠進行分析。
· 過濾方法:public Stream<T> filter(Predicate<? super T> predicate);
範例:執行過濾
1 package cn.demo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.stream.Stream; 6 7 public class Test { 8 public static void main(String[] args) throws Exception { 9 10 List<String> all = new ArrayList<String>(); 11 all.add("java"); 12 all.add("jsp"); 13 all.add("servlet"); 14 all.add("ajax"); 15 all.add("jquery"); 16 Stream<String> stream = all.stream().filter((e) -> e.contains("j")); 17 System.out.println(stream.count()); 18 } 19 }
結果:4
那麼只是過濾後顯示個數,一點意義都沒有,那麼最好的作法是將這些過濾後的數據收集起來變爲一個新的集合出現,那麼就可使用收集器完成:
public <R,A> R collect(Collector<? super T,A,R> collector);
這個方法須要使用一個Collector類型,這個類型能夠經過Collectors類取得:
· 收集的結果爲List集合:public static<T> Collector<T,?,List<T>> toList()。
1 package cn.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 Test { 9 public static void main(String[] args) throws Exception { 10 11 List<String> all = new ArrayList<String>(); 12 all.add("java"); 13 all.add("jsp"); 14 all.add("servlet"); 15 all.add("ajax"); 16 all.add("jquery"); 17 Stream<String> stream = all.stream().filter((e) -> e.contains("j")); 18 List<String> result = stream.collect(Collectors.toList()); 19 System.out.println(result); 20 } 21 }
結果:
[java, jsp, ajax, jquery]
既然流式處理之中主要是爲大數據而生的概念,那麼就須要考慮一個數據的分頁問題,提供有兩個方法:
· 跳過數據量:public Stream<T> skip(long n);
· 取出的數據量:public Stream<T> limit(long maxSize)。
範例:執行分頁控制
1 package cn.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 Test { 9 public static void main(String[] args) throws Exception { 10 11 List<String> all = new ArrayList<String>(); 12 all.add("java"); 13 all.add("jsp"); 14 all.add("servlet"); 15 all.add("ajax"); 16 all.add("jquery"); 17 all.add("javaScript"); 18 all.add("json"); 19 all.add("jdbc"); 20 Stream<String> stream = all.stream() 21 .skip(3).limit(3) 22 .map((e) -> e.toLowerCase()) 23 .filter((e) -> e.contains("j")); 24 List<String> result = stream.collect(Collectors.toList()); 25 System.out.println(result); 26 } 27 }
結果:
[ajax, jquery, javascript]
Stream的操做數據流能夠結合Lamda更簡單處理,可是難度也高。
三、MapReduce(概念核心)
大數據最本質的作法就是MapReduce,屬於數據的兩個處理階段:
· Map階段:對要參與運算的數據進行提早處理;
|- 方法:public <R> Stream<R> map(Function<? super T,? extends R> mapper);
· Reduce階段:對處理後的數據進行統計。
|- 方法:public <U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)。
下面作一個訂單操做的類,這個訂單的操做類之中保存有商品的名稱、商品單價、商品的購買數量。
範例:實現統計處理
1 package cn.demo; 2 3 import java.util.ArrayList; 4 import java.util.DoubleSummaryStatistics; 5 import java.util.List; 6 7 class Orders{ 8 private String ptitle; 9 private double price; 10 private int amount; 11 public Orders(String ptitle,double price,int amount){ 12 super(); 13 this.ptitle = ptitle; 14 this.price =price; 15 this.amount = amount; 16 } 17 public String getPtitle() { 18 return ptitle; 19 } 20 public void setPtitle(String ptitle) { 21 this.ptitle = ptitle; 22 } 23 public double getPrice() { 24 return price; 25 } 26 public void setPrice(double price) { 27 this.price = price; 28 } 29 public int getAmount() { 30 return amount; 31 } 32 public void setAmount(int amount) { 33 this.amount = amount; 34 } 35 } 36 public class Test { 37 public static void main(String[] args) throws Exception { 38 List<Orders> all = new ArrayList<Orders>(); 39 all.add(new Orders("平板電腦",4999,20)); 40 all.add(new Orders("手機",1099,200)); 41 all.add(new Orders("筆記本",9,80)); 42 all.add(new Orders("U盤",99,180)); 43 all.add(new Orders("鼠標",49,15)); 44 double allPrice = all.stream().map((obj) -> obj.getPrice() * obj.getAmount()).reduce((sum,x) -> sum + x).get(); 45 System.out.println("商品總銷量" + allPrice); 46 DoubleSummaryStatistics dss = all.stream().mapToDouble((obj) -> obj.getPrice() * obj.getAmount()).summaryStatistics(); 47 System.out.println("銷售總銷量" + dss.getCount()); 48 System.out.println("最高銷量" + dss.getMax()); 49 System.out.println("最低銷量" + dss.getMin()); 50 System.out.println("平均銷量" + dss.getAverage()); 51 System.out.println("總銷量" + dss.getSum()); 52 } 53 }
結果:
商品總銷量339055.0
銷售總銷量5
最高銷量219800.0
最低銷量720.0
平均銷量67811.0
總銷量339055.0
總結:大數據的開發也會採用相似的Lamda函數式處理模式完成。