Java Stream 流的使用過程解析
1. 篩選和切片
用謂詞篩選
filter方法接受一個(gè)返回boolean的方法。
List<Dish> vegetarianMenu=menu.stream().filter(Dish::isVegetarian) .collect(toList());
distinct去重
distinct方法,根據(jù)流中元素的hashCode和equals方法。例:
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); numbers.stream().filter(i -> i % 2 == 0).distinct().forEach(System.out::println);
截短流
limit(n)方法,該方法會(huì)返回一個(gè)不超過給定長度的流。
如果流是有序的,則最多會(huì)返回前n個(gè)元素。
limit也可以用在無序流上,比如源是一個(gè)Set。這種情況下,limit的結(jié)果不會(huì)以任何順序排列。
List<Dish> dishes = menu.stream() .filter(d -> d.getCalories() > 300).limit(3).collect(toList());
跳過元素
skip(n)方法返回一個(gè)扔掉了前n個(gè)元素的流。如果流中元素不足n個(gè),則返回一個(gè)空流。skip方法和limit方法可以看成是相反的操作。
2. 映射
簡單映射
流支持map方法,它會(huì)接受一個(gè)函數(shù)作為參數(shù)。這個(gè)函數(shù)會(huì)被應(yīng)用到每個(gè)元素上,并將其映射成一個(gè)新的元素。
下面的代碼,對(duì)words中的所有字符串應(yīng)用String::length方法。
List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action"); List<Integer> wordLengths = words.stream().map(String::length).collect(toList());
流的扁平化
什么叫扁平化?舉個(gè)例子:把Stream<Stream< String >> 變成 Steam< String > 就叫扁平化。
一言以蔽之,flatmap方法讓你把一個(gè)流中的每個(gè)值都換成另一個(gè)流,然后把所有的流連接起來成為一個(gè)流。
List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action"); //map函數(shù)中每個(gè)字符串都被切割為字符串?dāng)?shù)組,返回一個(gè)字符串?dāng)?shù)組的流 List<String[]> collect = words.stream() .map(word -> word.split("")) .distinct() .collect(toList()); //Arrays.stram方法接受一個(gè)數(shù)組返回一個(gè)流 String[] arrayOfWords = {"Goodbye", "World"}; Stream<String> streamOfwords = Arrays.stream(arrayOfWords); //第一個(gè)map返回一個(gè)字符串流,流中的元素是一個(gè)個(gè)的字符串?dāng)?shù)組。 //第二個(gè)map對(duì)每一個(gè)字符數(shù)組應(yīng)用Arrays.stream函數(shù),所以每一個(gè)字 //符串?dāng)?shù)組映射為一個(gè)字符串流。 List<Stream<String>> collect1 = words.stream() .map(word -> word.split("")) .map(v -> Arrays.stream(v)) .distinct() .collect(toList()); //第一個(gè)map返回一個(gè)字符串流,流中的元素是一個(gè)個(gè)的字符串?dāng)?shù)組。 //flatMap方法把流中的每個(gè)字符串?dāng)?shù)組都換成一個(gè)流,然后連接它們成 //為一個(gè)流 List<String> uniqueCharacters = words.stream() .map(w -> w.split("")) .flatMap(Arrays::stream) .distinct() .collect(Collectors.toList());
3. 查找和匹配
另一個(gè)常見的數(shù)據(jù)處理套路是看看數(shù)據(jù)集中的某些元素是否匹配一個(gè)給定的屬性。Stream API通過allMatch、anyMatch、noneMatch、findFirst、findAny方法提供了這樣的工具。
注:這些工具方法的返回值都不是流。所以它們是終端操作
檢查謂詞是否至少匹配一個(gè)元素
if(menu.stream().anyMatch(Dish::isVegetarian)){ System.out.println("The menu is (somewhat) vegetarian friendly!!"); }
檢查謂詞是否匹配所有元素
//是否所有元素都匹配 boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000); //是否所有元素都 不 匹配 boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000);
查找元素
findAny方法將返回當(dāng)前流中的任意元素。
Optional<Dish> dish = menu.stream().filter(Dish::isVegetarian).findAny();
Optional是什么?
查找第一個(gè)元素
List<Integer> someNumbers = Arrays.asList(1, 2, 3, 2, 5); //filter返回一個(gè)流,findfirst在該流中找第一個(gè) Optional<Integer> firstSquareDivisibleByThree = someNumbers.stream() .filter(x -> x == 2) .findFirst();
4. 歸約
歸約:將流中的元素相互結(jié)合起來,求一個(gè)值。比如學(xué)生是元素求分?jǐn)?shù)最高的學(xué)生、分?jǐn)?shù)是元素求某位同學(xué)的總分。
//求numbers中所有數(shù)值的集合 int product = numbers.stream().reduce(1, (a, b) -> a * b);
一個(gè)初始值,這里是0;
一個(gè)BinaryOperator來將兩個(gè)元素結(jié)合起來產(chǎn)生一個(gè)新值,這里我們用的是
lambda (a, b) -> a + b。
無初始值
reduce還有一個(gè)重載的變體,它不接受初始值,但是會(huì)返回一個(gè)Optional對(duì)象:
Optional sum = numbers.stream().reduce((a, b) -> (a + b));
小結(jié)
該篇對(duì)于流的使用,做了簡要的筆記??梢詽M足大多數(shù)情況的需求。不要只是看看,不要只是做了筆記。這么好用的api,趕緊用起來吧。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java虛擬機(jī)JVM類加載機(jī)制(從類文件到虛擬機(jī))
所謂的類加載機(jī)制就是虛擬機(jī)將class文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,轉(zhuǎn)換解析和初始化,形成虛擬機(jī)可以直接使用的java類型,本文給大家介紹類加載機(jī)制過程從類文件到虛擬機(jī)的詳細(xì)說明,感興趣的朋友跟隨小編一起看看吧2021-06-06Java CountDownLatch計(jì)數(shù)器與CyclicBarrier循環(huán)屏障
CountDownLatch是一種同步輔助,允許一個(gè)或多個(gè)線程等待其他線程中正在執(zhí)行的操作的ASET完成。它允許一組線程同時(shí)等待到達(dá)一個(gè)共同的障礙點(diǎn)2023-04-04解決springboot jpa @Column columnDefinition等屬性失效問題
這篇文章主要介紹了解決springboot jpa @Column columnDefinition等屬性失效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10java多線程抓取鈴聲多多官網(wǎng)的鈴聲數(shù)據(jù)
很容易就能發(fā)現(xiàn)通過改變 listId和page就能從服務(wù)器獲取鈴聲的json數(shù)據(jù), 通過解析json數(shù)據(jù), 可以看到都帶有{"hasmore":1,"curpage":1}這樣子的指示,通過判斷hasmore的值,決定是否進(jìn)行下一頁的抓取。 但是通過上面這個(gè)鏈接返回的json中不帶有鈴聲的下載地址2016-04-04詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實(shí)現(xiàn)原理
這篇文章主要介紹了詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實(shí)現(xiàn)原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06java使用正則表達(dá)為數(shù)字添加千位符的簡單方法
這篇文章主要介紹了java使用正則表達(dá)為數(shù)字添加千位符的簡單方法,需要的朋友可以參考下2014-04-04