這篇文章給大家介紹如何在Java項目中使用Stream流,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁制作,對成都茶樓設(shè)計等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)成都網(wǎng)站營銷優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。
1. 篩選和切片
用謂詞篩選
filter方法接受一個返回boolean的方法。
ListvegetarianMenu=menu.stream().filter(Dish::isVegetarian) .collect(toList());
distinct去重
distinct方法,根據(jù)流中元素的hashCode和equals方法。例:
Listnumbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); numbers.stream().filter(i -> i % 2 == 0).distinct().forEach(System.out::println);
截短流
limit(n)方法,該方法會返回一個不超過給定長度的流。
如果流是有序的,則最多會返回前n個元素。
limit也可以用在無序流上,比如源是一個Set。這種情況下,limit的結(jié)果不會以任何順序排列。
Listdishes = menu.stream() .filter(d -> d.getCalories() > 300).limit(3).collect(toList());
跳過元素
skip(n)方法返回一個扔掉了前n個元素的流。如果流中元素不足n個,則返回一個空流。skip方法和limit方法可以看成是相反的操作。
2. 映射
簡單映射
流支持map方法,它會接受一個函數(shù)作為參數(shù)。這個函數(shù)會被應(yīng)用到每個元素上,并將其映射成一個新的元素。
下面的代碼,對words中的所有字符串應(yīng)用String::length方法。
Listwords = Arrays.asList("Java 8", "Lambdas", "In", "Action"); List wordLengths = words.stream().map(String::length).collect(toList());
流的扁平化
什么叫扁平化?舉個例子:把Stream
一言以蔽之,flatmap方法讓你把一個流中的每個值都換成另一個流,然后把所有的流連接起來成為一個流。
Listwords = Arrays.asList("Java 8", "Lambdas", "In", "Action"); //map函數(shù)中每個字符串都被切割為字符串?dāng)?shù)組,返回一個字符串?dāng)?shù)組的流 List collect = words.stream() .map(word -> word.split("")) .distinct() .collect(toList()); //Arrays.stram方法接受一個數(shù)組返回一個流 String[] arrayOfWords = {"Goodbye", "World"}; Stream streamOfwords = Arrays.stream(arrayOfWords); //第一個map返回一個字符串流,流中的元素是一個個的字符串?dāng)?shù)組。 //第二個map對每一個字符數(shù)組應(yīng)用Arrays.stream函數(shù),所以每一個字 //符串?dāng)?shù)組映射為一個字符串流。 List > collect1 = words.stream() .map(word -> word.split("")) .map(v -> Arrays.stream(v)) .distinct() .collect(toList()); //第一個map返回一個字符串流,流中的元素是一個個的字符串?dāng)?shù)組。 //flatMap方法把流中的每個字符串?dāng)?shù)組都換成一個流,然后連接它們成 //為一個流 List uniqueCharacters = words.stream() .map(w -> w.split("")) .flatMap(Arrays::stream) .distinct() .collect(Collectors.toList());
3. 查找和匹配
另一個常見的數(shù)據(jù)處理套路是看看數(shù)據(jù)集中的某些元素是否匹配一個給定的屬性。Stream API通過allMatch、anyMatch、noneMatch、findFirst、findAny方法提供了這樣的工具。
注:這些工具方法的返回值都不是流。所以它們是終端操作
檢查謂詞是否至少匹配一個元素
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)前流中的任意元素。
Optionaldish = menu.stream().filter(Dish::isVegetarian).findAny();
Optional是什么?
查找第一個元素
ListsomeNumbers = Arrays.asList(1, 2, 3, 2, 5); //filter返回一個流,findfirst在該流中找第一個 Optional firstSquareDivisibleByThree = someNumbers.stream() .filter(x -> x == 2) .findFirst();
4. 歸約
歸約:將流中的元素相互結(jié)合起來,求一個值。比如學(xué)生是元素求分數(shù)最高的學(xué)生、分數(shù)是元素求某位同學(xué)的總分。
//求numbers中所有數(shù)值的集合 int product = numbers.stream().reduce(1, (a, b) -> a * b);
一個初始值,這里是0;
一個BinaryOperator來將兩個元素結(jié)合起來產(chǎn)生一個新值,這里我們用的是
lambda (a, b) -> a + b。
無初始值
reduce還有一個重載的變體,它不接受初始值,但是會返回一個Optional對象:
Optional sum = numbers.stream().reduce((a, b) -> (a + b));
關(guān)于如何在Java項目中使用Stream流就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。