博客說明java
文章所涉及的資料來自互聯網整理和我的總結,意在於我的學習和經驗彙總,若有什麼地方侵權,請聯繫本人刪除,謝謝!程序員
在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); } } }
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流」實際上是一個集合元素的函數模型,它並非集合,也不是數據結構,其自己並不存儲任何 元素(或其地址值code
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<>(); }
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); }
會將每個流元素交給該函數進行處理orm
public static void main(String[] args) { Stream<String> stream = Stream.of("張無忌", "張三丰", "周芷若"); stream.forEach(name‐> System.out.println(name)); }
能夠經過 filter 方法將一個流轉換成另外一個子集流
public static void main(String[] args) { Stream<String> original = Stream.of("張無忌", "張三丰", "周芷若"); Stream<String> result = original.filter(s ‐> s.startsWith("張")); }
若是須要將流中的元素映射到另外一個流中
public static void main(String[] args) { Stream<String> original = Stream.of("10", "12", "18"); Stream<Integer> result = original.map(str‐>Integer.parseInt(str)); }
數一數其中的元素個數
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 }
能夠對流進行截取,只取用前n個
public static void main(String[] args) { Stream<String> original = Stream.of("張無忌", "張三丰", "周芷若"); Stream<String> result = original.limit(2); System.out.println(result.count()); // 2 }
若是但願跳過前幾個元素
public static void main(String[] args) { Stream<String> original = Stream.of("張無忌", "張三丰", "周芷若"); Stream<String> result = original.skip(2); System.out.println(result.count()); // 1 }
若是有兩個流,但願合併成爲一個流
public static void main(String[] args) { Stream<String> streamA = Stream.of("張無忌"); Stream<String> streamB = Stream.of("張翠山"); Stream<String> result = Stream.concat(streamA, streamB); }
感謝
黑馬程序員
以及勤勞的本身
關注公衆號: 歸子莫,獲取更多的資料,還有更長的學習計劃