說明
在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) { Listlist = new ArrayList<>(); list.add("張無忌"); list.add("周芷若"); list.add("趙敏"); list.add("張強"); list.add("張三丰"); ListzhangList = new ArrayList<>(); for(String name : list){ if(name.startsWith("張")){ zhangList.add(name); } } ListshortList = 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) { Listlist = 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可以十分簡單明瞭的體現代碼的邏輯
“Stream流”其實是一個集合元素的函數模型,它並不是集合,也不是數據結構,其本身並不存儲任何 元素(或其地址值
獲取流
所有的 Collection 集合都可以通過 stream 默認方法獲取流;
Stream 接口的靜態方法 of 可以獲取數組對應的流。
根據Collection獲取流
public static void main(String[] args) { Listlist = new ArrayList<>(); Streamstream1 = list.stream(); Setset = new HashSet<>(); Streamstream2 = set.stream(); Vectorvector = new Vector<>(); }
根據Map獲取流
public static void main(String[] args) { Mapmap = new HashMap<>(); StreamkeyStream = map.keySet().stream(); StreamvalueStream = map.values().stream(); Stream<Map.Entry> entryStream = map.entrySet().stream(); }
根據數組獲取流
public static void main(String[] args) { String[] array = { "張無忌", "張翠山", "張三丰", "張一元" }; Streamstream = Stream.of(array); }
常用方法
逐一處理:forEach
會將每一個流元素交給該函數進行處理
public static void main(String[] args) { Streamstream = Stream.of("張無忌", "張三丰", "周芷若"); stream.forEach(name�> System.out.println(name)); }
過濾:filter
可以通過 filter 方法將一個流轉換成另一個子集流
public static void main(String[] args) { Streamoriginal = Stream.of("張無忌", "張三丰", "周芷若"); Streamresult = original.filter(s �> s.startsWith("張")); }
映射:map
如果需要將流中的元素映射到另一個流中
public static void main(String[] args) { Streamoriginal = Stream.of("10", "12", "18"); Streamresult = original.map(str�>Integer.parseInt(str)); }
統計個數:count
數一數其中的元素個數
public static void main(String[] args) { Streamoriginal = Stream.of("張無忌", "張三丰", "周芷若"); Streamresult = original.filter(s �> s.startsWith("張")); System.out.println(result.count()); // 2 }
取用前幾個:limit
可以對流進行截取,只取用前n個
public static void main(String[] args) { Streamoriginal = Stream.of("張無忌", "張三丰", "周芷若"); Streamresult = original.limit(2); System.out.println(result.count()); // 2 }
跳過前幾個:skip
如果希望跳過前幾個元素
public static void main(String[] args) { Streamoriginal = Stream.of("張無忌", "張三丰", "周芷若"); Streamresult = original.skip(2); System.out.println(result.count()); // 1 }
組合:concat
如果有兩個流,希望合併成為一個流
public static void main(String[] args) { StreamstreamA = Stream.of("張無忌"); StreamstreamB = Stream.of("張翠山"); Streamresult = Stream.concat(streamA, streamB); }
[zmcjlove ] Java Stream流知識總結已經有219次圍觀