目錄
引言
一、Stream背景概述
1、背景
2、概念
3、特性
4、Stream流的思想
5、 Stream流的好處
二、生成流
1、Collection體系集合生成
2、Map體系集合生成
3、陣列生成
三、Stream流中間操作方法
1、概念:
2、常見方法:
3、方法展示加拓展
4、常用方法代碼展示
filter代碼演示
limit&skip代碼演示
concat&distinct代碼演示
sorted代碼演示
map&mapToInt代碼演示
四、Stream流終結操作方法
1、概念:
2、常見方法
3、代碼演示
五、Stream流的收集操作
1、概念
2、常用方法
3、工具類Collectors提供了具體的收集方式
4、代碼演示
六、ENGING
引言
欲練此功,必先自......

DUCK不必,咱們就事論事,知識先開^\_/^,
一、Stream背景概述
1、背景
java 8 新特性
Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料,
Stream 使用一種類似用 SQL 陳述句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象,
Stream API可以極大提高Java程式員的生產力,讓程式員寫出高效率、干凈、簡潔的代碼,
這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等,
元素流在管道中經過中間操作(intermediate operation)的處理,最后由最終操作(terminal operation)得到前面處理的結果,
+--------------------+ +------+ +------+ +---+ +-------+ | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| +--------------------+ +------+ +------+ +---+ +-------+
List<Integer> transactionsIds =
widgets.stream()
.filter(b -> b.getColor() == RED)
.sorted((x,y) -> x.getWeight() - y.getWeight())
.mapToInt(Widget::getWeight)
.sum();
2、概念
什么是Stream?
Stream將要處理的元素集合看作一種流,在流的程序中,借助Stream API對流中的元素進行操作,比如:篩選、排序、聚合等,
Stream(流)是一個來自資料源的元素佇列并支持聚合操作,
元素是特定型別的物件,形成一個佇列, Java中的Stream并不會存盤元素,而是按需計算,
資料源 流的來源, 可以是集合,陣列,I/O channel, 產生器generator 等,
聚合操作 類似SQL陳述句一樣的操作, 比如filter, map, reduce, find, match, sorted等,
和以前的Collection操作不同, Stream操作還有兩個基礎的特征:
Pipelining: 中間操作都會回傳流物件本身, 這樣多個操作可以串聯成一個管道, 如同流式風格(fluent style), 這樣做可以對操作進行優化, 比如延遲執行(laziness)和短路( short-circuiting),
內部迭代: 以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進行迭代, 這叫做外部迭代, Stream提供了內部迭代的方式, 通過訪問者模式(Visitor)實作,
3、特性
stream不存盤資料,而是按照特定的規則對資料進行計算,一般會輸出結果,
stream不會改變資料源,通常情況下會產生一個新的集合或一個值,
stream具有延遲執行特性,只有呼叫終端操作時,中間操作才會執行,
4、Stream流的思想
5、 Stream流的好處
直接閱讀代碼的字面意思即可完美展示無關邏輯方式的語意:獲取流、過濾姓張、過濾長度為3、逐一列印
Stream流把真正的函式式編程風格引入到Java中
二、生成流
生成Stream流的方式:
1、Collection體系集合
2、Map體系集合
3、陣列
1、Collection體系集合生成
使用默認方法stream()生成流, default Stream<E> stream()
//Collection體系的集合可以使用默認方法stream()生成流
List<String> list = new ArrayList<String>();
Stream<String> listStream = list.stream();
Set<String> set = new HashSet<String>();
Stream<String> setStream = set.stream();
2、Map體系集合生成
把Map轉成Set集合,間接的生成流
//Map體系的集合間接的生成流
Map<String,Integer> map = new HashMap<String, Integer>();
Stream<String> keyStream = map.keySet().stream();
Stream<Integer> valueStream = map.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
3、陣列生成
通過Stream介面的靜態方法of(T... values)生成流
//陣列可以通過Stream介面的靜態方法of(T... values)生成流
String[] strArray = {"hello","world","java"};
Stream<String> strArrayStream = Stream.of(strArray);
Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");
Stream<Integer> intStream = Stream.of(10, 20, 30);
三、Stream流中間操作方法
1、概念:
中間操作的意思是,執行完此方法之后,Stream流依然可以繼續執行其他操作,
2、常見方法:
3、方法展示加拓展
forEach:
Stream 提供了新的方法 'forEach' 來迭代流中的每個資料,
以下代碼片段使用 forEach 輸出了10個亂數:
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
Collectors:
Collectors 類實作了很多歸約操作,例如將流轉換成集合和聚合元素,
Collectors 可用于回傳串列或字串:
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("篩選串列: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字串: " + mergedString);
4、常用方法代碼展示
filter代碼演示
public class StreamDemo01 {
public static void main(String[] args) {
//創建一個集合,存盤多個字串元素
ArrayList<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("張曼玉");
list.add("王祖賢");
list.add("柳巖");
list.add("張敏");
list.add("張無忌");
//需求1:把list集合中以張開頭的元素在控制臺輸出
list.stream().filter(s -> s.startsWith("張")).forEach(System.out::println);
System.out.println("--------");
//需求2:把list集合中長度為3的元素在控制臺輸出
list.stream().filter(s -> s.length() == 3).forEach(System.out::println);
System.out.println("--------");
//需求3:把list集合中以張開頭的,長度為3的元素在控制臺輸出
list.stream().filter(s -> s.startsWith("張")).filter(s -> s.length() == 3).forEach(System.out::println);
}
}
limit&skip代碼演示
public class StreamDemo02 {
public static void main(String[] args) {
//創建一個集合,存盤多個字串元素
ArrayList<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("張曼玉");
list.add("王祖賢");
list.add("柳巖");
list.add("張敏");
list.add("張無忌");
//需求1:取前3個資料在控制臺輸出
list.stream().limit(3).forEach(System.out::println);
System.out.println("--------");
//需求2:跳過3個元素,把剩下的元素在控制臺輸出
list.stream().skip(3).forEach(System.out::println);
System.out.println("--------");
//需求3:跳過2個元素,把剩下的元素中前2個在控制臺輸出
list.stream().skip(2).limit(2).forEach(System.out::println);
}
}
concat&distinct代碼演示
public class StreamDemo03 {
public static void main(String[] args) {
//創建一個集合,存盤多個字串元素
ArrayList<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("張曼玉");
list.add("王祖賢");
list.add("柳巖");
list.add("張敏");
list.add("張無忌");
//需求1:取前4個資料組成一個流
Stream<String> s1 = list.stream().limit(4);
//需求2:跳過2個資料組成一個流
Stream<String> s2 = list.stream().skip(2);
//需求3:合并需求1和需求2得到的流,并把結果在控制臺輸出
// Stream.concat(s1,s2).forEach(System.out::println);
//需求4:合并需求1和需求2得到的流,并把結果在控制臺輸出,要求字串元素不能重復
Stream.concat(s1,s2).distinct().forEach(System.out::println);
}
}
sorted代碼演示
public class StreamDemo04 {
public static void main(String[] args) {
//創建一個集合,存盤多個字串元素
ArrayList<String> list = new ArrayList<String>();
list.add("linqingxia");
list.add("zhangmanyu");
list.add("wangzuxian");
list.add("liuyan");
list.add("zhangmin");
list.add("zhangwuji");
//需求1:按照字母順序把資料在控制臺輸出
// list.stream().sorted().forEach(System.out::println);
//需求2:按照字串長度把資料在控制臺輸出
list.stream().sorted((s1,s2) -> {
int num = s1.length()-s2.length();
int num2 = num==0?s1.compareTo(s2):num;
return num2;
}).forEach(System.out::println);
}
}
map&mapToInt代碼演示
public class StreamDemo05 {
public static void main(String[] args) {
//創建一個集合,存盤多個字串元素
ArrayList<String> list = new ArrayList<String>();
list.add("10");
list.add("20");
list.add("30");
list.add("40");
list.add("50");
//需求:將集合中的字串資料轉換為整數之后在控制臺輸出
// list.stream().map(s -> Integer.parseInt(s)).forEach(System.out::println);
// list.stream().map(Integer::parseInt).forEach(System.out::println);
// list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
//int sum() 回傳此流中元素的總和
int result = list.stream().mapToInt(Integer::parseInt).sum();
System.out.println(result);
}
}
四、Stream流終結操作方法
1、概念:
終結操作的意思是,執行完此方法之后,Stream流將不能再執行其他操作,
2、常見方法

3、代碼演示
public class StreamDemo {
public static void main(String[] args) {
//創建一個集合,存盤多個字串元素
ArrayList<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("張曼玉");
list.add("王祖賢");
list.add("柳巖");
list.add("張敏");
list.add("張無忌");
//需求1:把集合中的元素在控制臺輸出
// list.stream().forEach(System.out::println);
//需求2:統計集合中有幾個以張開頭的元素,并把統計結果在控制臺輸出
long count = list.stream().filter(s -> s.startsWith("張")).count();
System.out.println(count);
}
}
五、Stream流的收集操作
1、概念
對資料使用Stream流的方式操作完畢后,可以把流中的資料收集到集合中
2、常用方法

3、工具類Collectors提供了具體的收集方式

4、代碼演示
public class CollectDemo {
public static void main(String[] args) {
//創建List集合物件
List<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("張曼玉");
list.add("王祖賢");
list.add("柳巖");
/*
//需求1:得到名字為3個字的流
Stream<String> listStream = list.stream().filter(s -> s.length() == 3);
//需求2:把使用Stream流操作完畢的資料收集到List集合中并遍歷
List<String> names = listStream.collect(Collectors.toList());
for(String name : names) {
System.out.println(name);
}
*/
//創建Set集合物件
Set<Integer> set = new HashSet<Integer>();
set.add(10);
set.add(20);
set.add(30);
set.add(33);
set.add(35);
/*
//需求3:得到年齡大于25的流
Stream<Integer> setStream = set.stream().filter(age -> age > 25);
//需求4:把使用Stream流操作完畢的資料收集到Set集合中并遍歷
Set<Integer> ages = setStream.collect(Collectors.toSet());
for(Integer age : ages) {
System.out.println(age);
}
*/
//定義一個字串陣列,每一個字串資料由姓名資料和年齡資料組合而成
String[] strArray = {"林青霞,30", "張曼玉,35", "王祖賢,33", "柳巖,25"};
//需求5:得到字串中年齡資料大于28的流
Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
//需求6:把使用Stream流操作完畢的資料收集到Map集合中并遍歷,字串中的姓名作鍵,年齡作值
Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
Set<String> keySet = map.keySet();
for (String key : keySet) {
Integer value = map.get(key);
System.out.println(key + "," + value);
}
}
}
六、ENGING

多讀書吧, 會看書的人,就會看云、看雪、看夜泛星辰......
相信,終是美好會勝過一切,是嗎,my princess?是吧......
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/350919.html
標籤:java
上一篇:java物件序列化與反序列化
下一篇:Sequential And Linked Lists - 順序表 和 鏈表 - 鏈表部分 - java(圖文并茂,你值得一看)

