最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Stream 流的使用過程解析

 更新時間:2019年10月31日 10:27:14   作者:Mr.O-O  
這篇文章主要介紹了Java Stream 流的使用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1. 篩選和切片

用謂詞篩選

filter方法接受一個返回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)方法,該方法會返回一個不超過給定長度的流。

如果流是有序的,則最多會返回前n個元素。

limit也可以用在無序流上,比如源是一個Set。這種情況下,limit的結果不會以任何順序排列。

List<Dish> dishes = menu.stream() .filter(d -> d.getCalories() > 300).limit(3).collect(toList());

跳過元素

skip(n)方法返回一個扔掉了前n個元素的流。如果流中元素不足n個,則返回一個空流。skip方法和limit方法可以看成是相反的操作。

2. 映射

簡單映射

流支持map方法,它會接受一個函數(shù)作為參數(shù)。這個函數(shù)會被應用到每個元素上,并將其映射成一個新的元素。

下面的代碼,對words中的所有字符串應用String::length方法。

List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action"); 
List<Integer> wordLengths = words.stream().map(String::length).collect(toList());

流的扁平化

什么叫扁平化?舉個例子:把Stream<Stream< String >> 變成 Steam< String > 就叫扁平化。

一言以蔽之,flatmap方法讓你把一個流中的每個值都換成另一個流,然后把所有的流連接起來成為一個流。

    List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action");
    //map函數(shù)中每個字符串都被切割為字符串數(shù)組,返回一個字符串數(shù)組的流
    List<String[]> collect = words.stream()
        .map(word -> word.split(""))
        .distinct()
        .collect(toList());
    //Arrays.stram方法接受一個數(shù)組返回一個流
    String[] arrayOfWords = {"Goodbye", "World"};
    Stream<String> streamOfwords = Arrays.stream(arrayOfWords);

    //第一個map返回一個字符串流,流中的元素是一個個的字符串數(shù)組。
    //第二個map對每一個字符數(shù)組應用Arrays.stream函數(shù),所以每一個字     //符串數(shù)組映射為一個字符串流。
    List<Stream<String>> collect1 = words.stream()
        .map(word -> word.split(""))
        .map(v -> Arrays.stream(v))
        .distinct()
        .collect(toList());
    //第一個map返回一個字符串流,流中的元素是一個個的字符串數(shù)組。
    //flatMap方法把流中的每個字符串數(shù)組都換成一個流,然后連接它們成    //為一個流
    List<String> 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方法將返回當前流中的任意元素。

Optional<Dish> dish = menu.stream().filter(Dish::isVegetarian).findAny();

Optional是什么?

查找第一個元素

List<Integer> someNumbers = Arrays.asList(1, 2, 3, 2, 5); 
//filter返回一個流,findfirst在該流中找第一個
Optional<Integer> firstSquareDivisibleByThree = 
 someNumbers.stream() 
 .filter(x -> x == 2) 
 .findFirst(); 

4. 歸約

歸約:將流中的元素相互結合起來,求一個值。比如學生是元素求分數(shù)最高的學生、分數(shù)是元素求某位同學的總分。

//求numbers中所有數(shù)值的集合
int product = numbers.stream().reduce(1, (a, b) -> a * b);

一個初始值,這里是0;

一個BinaryOperator來將兩個元素結合起來產(chǎn)生一個新值,這里我們用的是

lambda (a, b) -> a + b。

無初始值

reduce還有一個重載的變體,它不接受初始值,但是會返回一個Optional對象:

Optional sum = numbers.stream().reduce((a, b) -> (a + b));

小結

該篇對于流的使用,做了簡要的筆記。可以滿足大多數(shù)情況的需求。不要只是看看,不要只是做了筆記。這么好用的api,趕緊用起來吧。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 解決Android Studio安裝后運行出錯dose not...和Internal error...

    解決Android Studio安裝后運行出錯dose not...和Internal error...

    這篇文章主要介紹了解決Android Studio安裝后運行出錯dose not...和Internal error...的相關資料,需要的朋友可以參考下
    2017-03-03
  • SpringBoot如何自定義線程池配置類

    SpringBoot如何自定義線程池配置類

    有時候我們在項目中做一些長鏈路的跑批任務時,基于Springboot項目的定時任務,我們可以指定一個自定義的線程配置類進行單獨提供給具體跑批任務使用,而不占用整個系統(tǒng)資源,這篇文章主要介紹了SpringBoot如何自定義線程池配置類,需要的朋友可以參考下
    2024-04-04
  • Spring5中的WebClient使用方法詳解

    Spring5中的WebClient使用方法詳解

    這篇文章主要給大家介紹了關于Spring5中WebClient使用方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring5具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • 關于Feign調(diào)用服務Headers傳參問題

    關于Feign調(diào)用服務Headers傳參問題

    這篇文章主要介紹了關于Feign調(diào)用服務Headers傳參問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 一文帶你了解Java中的ForkJoin

    一文帶你了解Java中的ForkJoin

    這篇文章主要介紹了一文帶你了解Java中的ForkJoin,F(xiàn)orkJoinTask本身的依賴關系并不復雜,它與異步任務計算FutureTask一樣均實現(xiàn)了Future接口,下文更多相關資料,需要的小伙伴可以參考一下
    2022-04-04
  • 使用spring aop 統(tǒng)一捕獲異常和寫日志的示例demo

    使用spring aop 統(tǒng)一捕獲異常和寫日志的示例demo

    本文通過一個小demo給大家介紹spring AOP 實現(xiàn)的異常捕獲和日志的方法技巧,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • 在Java中使用日志框架log4j的方法

    在Java中使用日志框架log4j的方法

    Log4j有三個主要的組件/對象:Loggers(記錄器),Appenders (輸出源)和Layouts(布局)。這里可簡單理解為日志類別,日志要輸出的地方和日志以何種形式輸出,今天通過本文給大家分享Java日志框架log4j的相關知識,感興趣的朋友一起看看吧
    2021-08-08
  • Java開啟新線程并傳參方法代碼實現(xiàn)

    Java開啟新線程并傳參方法代碼實現(xiàn)

    這篇文章主要介紹了Java開啟新線程并傳參方法代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 關于動態(tài)參數(shù)使用@PathVariable的解析

    關于動態(tài)參數(shù)使用@PathVariable的解析

    這篇文章主要介紹了關于動態(tài)參數(shù)使用@PathVariable的解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java 中的 this 和 super 區(qū)別

    Java 中的 this 和 super 區(qū)別

    這篇文章主要介紹了Javathis與super本質(zhì)區(qū)別,this與super是類實例化時通往Object類通道的打通者;this和super在程序中由于其經(jīng)常被隱式的使用而被我們忽略,但是理解其作用和使用規(guī)范肯定是必須的。接下來將詳述this與super的作用和區(qū)別,需要的朋友可以參考一下
    2021-11-11

最新評論

合川市| 吉木乃县| 南木林县| 怀安县| 南澳县| 历史| 崇义县| 新营市| 临朐县| 瓮安县| 宁河县| 镇康县| 兴隆县| 萨迦县| 青龙| 于田县| 奈曼旗| 浙江省| 西平县| 楚雄市| 肥城市| 荥阳市| 文昌市| 怀安县| 贵州省| 化州市| 宝应县| 昭通市| 正安县| 文山县| 乌拉特后旗| 彰化市| 武功县| 江北区| 吉木萨尔县| 台前县| 贵阳市| 天祝| 全南县| 车致| 镶黄旗|