Java--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);
}

感謝

黑馬程序員

以及勤勞的自己

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