Java--Stream流詳解 博客說明 文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯繫本人刪除,謝謝! 說明 在Java 8中,得益於Lambda所帶來的函數式編程,引入了一個全新的Stream概念,用於解決已有集合類庫既有的弊端 遍歷 傳統集合在於使 ...
Java--Stream流詳解
博客說明
文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯繫本人刪除,謝謝!
說明
在Java 8中,得益於Lambda所帶來的函數式編程,引入了一個全新的Stream概念,用於解決已有集合類庫既有的弊端
遍歷
傳統集合在於使用迴圈遍歷
Java 8的Lambda讓我們可以更加專註於做什麼(What),而不是怎麼做(How),這點此前已經結合內部類進行 了對比說明。現在,我們仔細體會一下上例代碼,可以發現:
-
for迴圈的語法就是“怎麼做”
-
for迴圈的迴圈體才是“做什麼”
傳統集合遍歷
import java.util.ArrayList;
import java.util.List;
/**
* @author tanglei
* @date 2020/6/10 10:21 下午
*/
public class NormalFilter {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("張無忌");
list.add("周芷若");
list.add("趙敏");
list.add("張強");
list.add("張三豐");
List<String> zhangList = new ArrayList<>();
for(String name : list){
if(name.startsWith("張")){
zhangList.add(name);
}
}
List<String> shortList = new ArrayList<>();
for(String name : zhangList){
if(name.length() == 3){
shortList.add(name);
}
}
for (String name : shortList){
System.out.println(name);
}
}
}
Stream的優雅
import java.util.ArrayList;
import java.util.List;
/**
* @author tanglei
* @date 2020/6/10 10:28 下午
*/
public class StreamFilter {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("張無忌");
list.add("周芷若");
list.add("趙敏");
list.add("張強");
list.add("張三豐");
list.stream()
.filter(s -> s.startsWith("張"))
.filter(s -> s.length() == 3)
.forEach(System.out::println);
}
}
使用stream可以十分簡單明瞭的體現代碼的邏輯
“Stream流”其實是一個集合元素的函數模型,它並不是集合,也不是數據結構,其本身並不存儲任何 元素(或其地址值
獲取流
- 所有的 Collection 集合都可以通過 stream 預設方法獲取流;
- Stream 介面的靜態方法 of 可以獲取數組對應的流。
根據Collection獲取流
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
Set<String> set = new HashSet<>();
Stream<String> stream2 = set.stream();
Vector<String> vector = new Vector<>();
}
根據Map獲取流
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
Stream<String> keyStream = map.keySet().stream();
Stream<String> valueStream = map.values().stream(); Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();
}
根據數組獲取流
public static void main(String[] args) {
String[] array = { "張無忌", "張翠山", "張三豐", "張一元" };
Stream<String> stream = Stream.of(array);
}
常用方法
逐一處理:forEach
會將每一個流元素交給該函數進行處理
public static void main(String[] args) {
Stream<String> stream = Stream.of("張無忌", "張三豐", "周芷若");
stream.forEach(name‐> System.out.println(name));
}
過濾:filter
可以通過 filter 方法將一個流轉換成另一個子集流
public static void main(String[] args) {
Stream<String> original = Stream.of("張無忌", "張三豐", "周芷若");
Stream<String> result = original.filter(s ‐> s.startsWith("張"));
}
映射:map
如果需要將流中的元素映射到另一個流中
public static void main(String[] args) {
Stream<String> original = Stream.of("10", "12", "18");
Stream<Integer> result = original.map(str‐>Integer.parseInt(str));
}
統計個數:count
數一數其中的元素個數
public static void main(String[] args) {
Stream<String> original = Stream.of("張無忌", "張三豐", "周芷若");
Stream<String> result = original.filter(s ‐> s.startsWith("張"));
System.out.println(result.count()); // 2
}
取用前幾個:limit
可以對流進行截取,只取用前n個
public static void main(String[] args) {
Stream<String> original = Stream.of("張無忌", "張三豐", "周芷若");
Stream<String> result = original.limit(2);
System.out.println(result.count()); // 2
}
跳過前幾個:skip
如果希望跳過前幾個元素
public static void main(String[] args) {
Stream<String> original = Stream.of("張無忌", "張三豐", "周芷若");
Stream<String> result = original.skip(2);
System.out.println(result.count()); // 1
}
組合:concat
如果有兩個流,希望合併成為一個流
public static void main(String[] args) {
Stream<String> streamA = Stream.of("張無忌");
Stream<String> streamB = Stream.of("張翠山");
Stream<String> result = Stream.concat(streamA, streamB);
}
感謝
黑馬程式員
以及勤勞的自己
關註公眾號: 歸子莫,獲取更多的資料,還有更長的學習計劃