Java關(guān)于JDK1.8新特性的Stream流
Java 的Stream流
一、定義
JDK1.8 中增加了Stream流,Stream流是一個(gè)來自數(shù)據(jù)源的元素隊(duì)列并支持聚合操作。元素是特定類型的對(duì)象,形成一個(gè)隊(duì)列,Java中的Stream并不會(huì)存儲(chǔ)元素,而是按需計(jì)算數(shù)據(jù)源是流的來源,可以使集合,數(shù)組,I/O channel,生成器generator等。聚合操作類似SQL語句一樣的操作,比如filter
,map
,reduce
,match
,sorted
等
二、操作的特征
- 中間的操作都會(huì)返回流對(duì)象本身,這樣多個(gè)操作可以串聯(lián)成一個(gè)管道,如同流式風(fēng)格
- 內(nèi)部迭代:以前對(duì)集合的遍歷是通過Iterator或者For-Each的方式,顯式的在集合外部進(jìn)行迭代,這叫做外部迭代,而Stream流式內(nèi)部迭代。
三、代碼示例
1、生成流
如下代碼的意思是,首先創(chuàng)建一個(gè)集合,然后過濾出所有不為空的元素,重新組成一個(gè)集合
List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd", ""); List<String> strings = stringList.stream().filter(string -> StringUtils.isNotBlank(string)).collect(Collectors.toList()); System.out.println("*********過濾后的集合是"+strings);
2、forEach 迭代
strings.forEach(System.out::println);
3、limit方法用于獲取指定數(shù)量的流
如下就是獲取一個(gè)長(zhǎng)度為10的流。
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
4、map
map方法用于映射每個(gè)元素,以下代碼片段使用map輸出元素對(duì)應(yīng)的平方數(shù)
vList<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5, 8, 9); //獲取對(duì)應(yīng)的平方數(shù) List<Integer> integers = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList()); System.out.println("*********獲取對(duì)應(yīng)的平方數(shù)"+integers);
5、sorted
sorted方法用于對(duì)流進(jìn)行排序
如下,就是按照元素的大小進(jìn)行排序
List<Integer> orgList = Arrays.asList(10, 9, 8, 7, 6, 13, 16, 0, 1, 2); List<Integer> sortedList = orgList.stream().sorted().collect(Collectors.toList()); System.out.println("*********排序后集合是"+sortedList);
6、并行(parallel)程序
List<String> emptyList = Arrays.asList("abc", "", "bc", "efg", "abcd", "", ""); //獲取空字符串的數(shù)量 long count = emptyList.parallelStream().filter(string -> string.isEmpty()).count(); System.out.println("*****集合中的空字符串個(gè)數(shù)=" + count);
7、Collectors
Collectors類實(shí)現(xiàn)了很多歸約操作,例如將流轉(zhuǎn)換成集合和集合元素,Collectors可用于返回列表或字符串
List<String> orgCollectors = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl"); List<String> filtered = orgCollectors.stream().filter(string -> !string.isEmpty()) .collect(Collectors.toList()); System.out.println("篩選列表:" + filtered); String mergedString = stringList.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(",")); System.out.println("合并字符串:" + mergedString);
統(tǒng)計(jì):
//統(tǒng)計(jì) List<Integer> orgNums = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics statistics = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("列表中最大的數(shù):" + statistics.getMax()); System.out.println("列表中最小的數(shù):" + statistics.getMin()); System.out.println("所有數(shù)之和:" + statistics.getSum()); System.out.println("平均數(shù):" + statistics.getAverage());
8、轉(zhuǎn)化(將枚舉類轉(zhuǎn)成map)
將一個(gè)枚舉類轉(zhuǎn)成一個(gè)map,使用的示例可以參考下方:
Map<Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc()));
完整的代碼是:
public enum DisableFlagEnum { NORMAL(0, "正常"), DELETE(1, "已刪除"); private Integer code; private String desc; DisableFlagEnum(Integer code, String desc) { this.code = code; this.desc = desc; } public Integer getCode() { return code; } public String getDesc() { return desc; } public static String getDesc(Integer code) { Map<Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc())); return disableFlagMap.get(code); } }
demo的運(yùn)行結(jié)果:
總結(jié):
本文首先介紹了JDK1.8中的Stream流,Stream流是是一個(gè)來自數(shù)據(jù)源的元素隊(duì)列并支持聚合操作。它的特點(diǎn)就是中間過程不會(huì)存儲(chǔ)數(shù)據(jù),不會(huì)改變數(shù)據(jù)源本身。接著介紹了stream的使用示例,stream流的使用一般是要結(jié)合函數(shù)式接口使用的。
以上就是Java的Stream流的詳細(xì)內(nèi)容,更多關(guān)于Java的Stream流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot設(shè)置默認(rèn)主頁(yè)的方法步驟
這篇文章主要介紹了SpringBoot設(shè)置默認(rèn)主頁(yè)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Java技術(shù)長(zhǎng)久占居主要地位的12個(gè)原因
這篇文章主要為大家詳細(xì)介紹了12個(gè)Java長(zhǎng)久占居主要地位的原因,感興趣的小伙伴們可以參考一下2016-07-07springboot接口多實(shí)現(xiàn)類選擇性注入解決方案
這篇文章主要為大家介紹了springboot接口多實(shí)現(xiàn)類選擇性注入解決方案的四種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03SpringBoot 多線程事務(wù)回滾的實(shí)現(xiàn)
本文是基于springboot的@Async注解開啟多線程,并通過自定義注解和AOP實(shí)現(xiàn)的多線程事務(wù),避免繁瑣的手動(dòng)提交/回滾事務(wù),感興趣的可以了解一下2024-02-02Spring Security 表單登錄功能的實(shí)現(xiàn)方法
這篇文章主要介紹了Spring Security 表單登錄,本文將構(gòu)建在之前簡(jiǎn)單的 Spring MVC示例 之上,因?yàn)檫@是設(shè)置Web應(yīng)用程序和登錄機(jī)制的必不可少的。需要的朋友可以參考下2019-06-06Java8日期時(shí)間類LocalDateTime比較大小舉例
LocalDate是Java?8中的日期類之一,它表示一個(gè)日期,下面這篇文章主要給大家介紹了關(guān)于Java8日期時(shí)間類LocalDateTime比較大小的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05