Java Stream流知識(shí)總結(jié)
說(shuō)明
在Java 8中,得益于Lambda所帶來(lái)的函數(shù)式編程,引入了一個(gè)全新的Stream概念,用于解決已有集合類庫(kù)既有的弊端
遍歷
傳統(tǒng)集合在于使用循環(huán)遍歷
Java 8的Lambda讓我們可以更加專注于做什么(What),而不是怎么做(How),這點(diǎn)此前已經(jīng)結(jié)合內(nèi)部類進(jìn)行 了對(duì)比說(shuō)明。現(xiàn)在,我們仔細(xì)體會(huì)一下上例代碼,可以發(fā)現(xiàn):
- for循環(huán)的語(yǔ)法就是“怎么做”
- for循環(huán)的循環(huán)體才是“做什么”
傳統(tǒng)集合遍歷
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("張無(wú)忌"); list.add("周芷若"); list.add("趙敏"); list.add("張強(qiáng)"); 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的優(yōu)雅
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("張無(wú)忌"); list.add("周芷若"); list.add("趙敏"); list.add("張強(qiáng)"); list.add("張三豐"); list.stream() .filter(s -> s.startsWith("張")) .filter(s -> s.length() == 3) .forEach(System.out::println); } }
Stream的優(yōu)雅使用stream可以十分簡(jiǎn)單明了的體現(xiàn)代碼的邏輯
“Stream流”其實(shí)是一個(gè)集合元素的函數(shù)模型,它并不是集合,也不是數(shù)據(jù)結(jié)構(gòu),其本身并不存儲(chǔ)任何 元素(或其地址值
獲取流
- 所有的 Collection 集合都可以通過(guò) stream 默認(rèn)方法獲取流;
- Stream 接口的靜態(tài)方法 of 可以獲取數(shù)組對(duì)應(yīng)的流。
根據(jù)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<>(); }
根據(jù)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(); }
根據(jù)數(shù)組獲取流
public static void main(String[] args) { String[] array = { "張無(wú)忌", "張翠山", "張三豐", "張一元" }; Stream<String> stream = Stream.of(array); }
常用方法
逐一處理:forEach
會(huì)將每一個(gè)流元素交給該函數(shù)進(jìn)行處理
public static void main(String[] args) { Stream<String> stream = Stream.of("張無(wú)忌", "張三豐", "周芷若"); stream.forEach(name‐> System.out.println(name)); }
過(guò)濾:filter
可以通過(guò) filter 方法將一個(gè)流轉(zhuǎn)換成另一個(gè)子集流
public static void main(String[] args) { Stream<String> original = Stream.of("張無(wú)忌", "張三豐", "周芷若"); Stream<String> result = original.filter(s ‐> s.startsWith("張")); }
映射:map
如果需要將流中的元素映射到另一個(gè)流中
public static void main(String[] args) { Stream<String> original = Stream.of("10", "12", "18"); Stream<Integer> result = original.map(str‐>Integer.parseInt(str)); }
統(tǒng)計(jì)個(gè)數(shù):count
數(shù)一數(shù)其中的元素個(gè)數(shù)
public static void main(String[] args) { Stream<String> original = Stream.of("張無(wú)忌", "張三豐", "周芷若"); Stream<String> result = original.filter(s ‐> s.startsWith("張")); System.out.println(result.count()); // 2 }
取用前幾個(gè):limit
可以對(duì)流進(jìn)行截取,只取用前n個(gè)
public static void main(String[] args) { Stream<String> original = Stream.of("張無(wú)忌", "張三豐", "周芷若"); Stream<String> result = original.limit(2); System.out.println(result.count()); // 2 }
跳過(guò)前幾個(gè):skip
如果希望跳過(guò)前幾個(gè)元素
public static void main(String[] args) { Stream<String> original = Stream.of("張無(wú)忌", "張三豐", "周芷若"); Stream<String> result = original.skip(2); System.out.println(result.count()); // 1 }
組合:concat
如果有兩個(gè)流,希望合并成為一個(gè)流
public static void main(String[] args) { Stream<String> streamA = Stream.of("張無(wú)忌"); Stream<String> streamB = Stream.of("張翠山"); Stream<String> result = Stream.concat(streamA, streamB); }
感謝
黑馬程序員
以及勤勞的自己
以上就是Java Stream流知識(shí)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java Stream流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java使用FileInputStream流讀取文件示例詳解
- Java實(shí)現(xiàn)inputstream流的復(fù)制代碼實(shí)例
- 通過(guò)實(shí)例了解Java 8創(chuàng)建Stream流的5種方法
- Java8中的Stream流式操作教程之王者歸來(lái)
- Java中FileOutputStream流的write方法
- Java8新特性Stream流實(shí)例詳解
- Java中的stream流的概念解析及實(shí)際運(yùn)用總結(jié)
- 簡(jiǎn)單總結(jié)Java IO中stream流的使用方法
- 舉例講解Java中的Stream流概念
- java8 Stream流逐行處理文本文件
相關(guān)文章
Java Math類的三個(gè)方法ceil,floor,round用法
這篇文章主要介紹了Java Math類的三個(gè)方法ceil,floor,round用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07詳解Java8中接口的默認(rèn)方法和靜態(tài)方法
Java 8是Java語(yǔ)言的一個(gè)重要版本,其中引入了許多新特性和改進(jìn),其中一個(gè)值得關(guān)注的特性是接口的默認(rèn)方法和靜態(tài)方法,本文就來(lái)和大家簡(jiǎn)單講講吧2023-05-05springboot之端口設(shè)置和contextpath的配置方式
這篇文章主要介紹了springboot之端口設(shè)置和contextpath的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01解決maven update project 后項(xiàng)目jdk變成1.5的問(wèn)題
下面小編就為大家?guī)?lái)一篇解決maven update project 后項(xiàng)目jdk變成1.5的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起 小編過(guò)來(lái)看看吧2016-11-11kotlin java 混合代碼 maven 打包實(shí)現(xiàn)
這篇文章主要介紹了kotlin java 混合代碼 maven 打包實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03mybatis plus自動(dòng)生成代碼tinyint(1)自動(dòng)轉(zhuǎn)換為Boolean的問(wèn)題及解決
這篇文章主要介紹了mybatis plus自動(dòng)生成代碼tinyint(1)自動(dòng)轉(zhuǎn)換為Boolean的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Java8 stream 中利用 groupingBy 進(jìn)行多字段分組求和案例
這篇文章主要介紹了Java8 stream 中利用 groupingBy 進(jìn)行多字段分組求和案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08