如何在Java項(xiàng)目中使用Stream流

這篇文章給大家介紹如何在Java項(xiàng)目中使用Stream流,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁制作,對(duì)成都茶樓設(shè)計(jì)等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計(jì),網(wǎng)站優(yōu)化推廣哪家好,專業(yè)成都網(wǎng)站營銷優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。

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));

關(guān)于如何在Java項(xiàng)目中使用Stream流就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁標(biāo)題:如何在Java項(xiàng)目中使用Stream流
網(wǎng)頁網(wǎng)址:http://muchs.cn/article10/ghjsdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、微信公眾號(hào)、面包屑導(dǎo)航、全網(wǎng)營銷推廣、域名注冊(cè)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管