1 Stream基本操作
從JDK 1.8開始,由於已經進入了大數據時代,所以在類集裏面也支持有數據的流式分析處理操作,爲此就專門提供了一個Stream的接口,同時在Collection接口裏面也提供有爲此接口實例化的方法。
(1)獲取Stream接口對象:default Stream<E> stream()
Stream主要功能是進行數據的分析處理,同時主要是針對於集合中的數據進行分析操作。
範例:Stream的基本操作
package org.lks.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
public class JavaReflectDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
Collections.addAll(list, "Java", "JSP", "JavaScript", "Json", "Python", "Ruby", "Go");
Stream<String> stream = list.stream();
System.out.println(stream.filter((ele)->ele.toLowerCase().contains("j")).count());
}
}
但是以上的程序只是實現了一些最基礎的數據的個數的統計,而更多情況下我們可能需要的是獲取裏面的滿足條件的數據內容,所以此時可以實現數據的採集操作。
範例:數據採集
package org.lks.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class JavaReflectDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
Collections.addAll(list, "Java", "JSP", "JavaScript", "Json", "Python", "Ruby", "Go");
Stream<String> stream = list.stream();
List<String> result = stream.filter((ele)->ele.toLowerCase().contains("j")).collect(Collectors.toList());
System.out.println(result);
}
}
在Stream數據流處理的過程之中還允許進行數據的分頁處理,提供有兩個方法:
(1)設置取出最大的數據量:Stream<T> limit(long maxSize)
(2)跳過指定數據量:Stream<T> skip(long n)
範例:觀察分頁
package org.lks.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class JavaReflectDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
Collections.addAll(list, "Java", "JSP", "JavaScript", "Json", "Python", "Ruby", "Go");
Stream<String> stream = list.stream();
List<String> result = stream.filter((ele)->ele.toLowerCase().contains("j")).skip(2).limit(2).collect(Collectors.toList());
System.out.println(result);
}
}
Stream的操作主要是利用自身的特點實現數據的分析處理操作。
2 MapReduce基礎模型
在進行數據分析的處理之中有一個最重要的基礎模型:MapReduce模型,對於這個模型一共分爲兩個部分:Map處理部分,Reduce分析部分,在進行數據分析之前必須要對數據進行合理的處理,而後纔可以做統計分析操作。
範例:MapReduce基礎模型
package org.lks.demo;
import java.util.ArrayList;
import java.util.DoubleSummaryStatistics;
import java.util.List;
public class JavaReflectDemo {
public static void main(String[] args) {
List<Order> list = new ArrayList<Order>();
list.add(new Order("Java", 1.9, 10));
list.add(new Order("JSP", 3.7, 100));
list.add(new Order("JavaScript", 8.0, 12130));
list.add(new Order("Json", 1.5, 1320));
list.add(new Order("JJ", 1325.23, 34));
list.add(new Order("Python", 1.23, 123340));
//分析購買商品中帶有“j”的數據信息,並且進行商品單價和數量的處理,隨後彙總分析
DoubleSummaryStatistics stat = list.stream().filter((ele)->ele.getName().toLowerCase().contains("j")).mapToDouble((ele)->ele.getPrice() * ele.getAmount()).summaryStatistics();
System.out.println(stat.getCount());
System.out.println(stat.getSum());
System.out.println(stat.getAverage());
System.out.println(stat.getMax());
System.out.println(stat.getMin());
}
}
class Order{
private String name;
private double price;
private long amount;
public Order() {}
public Order(String name, double price, long amount) {
this.name = name;
this.price = price;
this.amount = amount;
}
public String getName() {
return this.name;
}
public double getPrice() {
return this.price;
}
public long getAmount() {
return this.amount;
}
}
這些分析操作只是JDK本身提供的支持,而實際之中,肯定不可能這樣進行,因爲所有的數據如果都保存在內存裏面,那麼面對於大數據的環境,就崩了。