00 33Java高級之Stream數據流

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本身提供的支持,而實際之中,肯定不可能這樣進行,因爲所有的數據如果都保存在內存裏面,那麼面對於大數據的環境,就崩了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章