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

Java流處理stream使用詳解

 更新時間:2022年10月10日 10:06:14   作者:知奕奕  
Java8的另一大亮點Stream,它與java.io包里的InputStream和OutputStream是完全不同的概念,下面這篇文章主要給大家介紹了關(guān)于Java8中Stream詳細使用方法的相關(guān)資料,需要的朋友可以參考下

基本流

foreach 實現(xiàn)了外部迭代,它是建立于集合的基礎(chǔ)上;

stream 流實現(xiàn)的是內(nèi)部迭代

中間操作與終端操作

對任意集合使用 stream() 方法來使用流操作來對其進行內(nèi)部迭代;

中間操作:流水線上的中間操作,他會返回一個 stream

終端操作:一般位于流水線末尾,輸出一個非 stream 類型的值

這是下方代碼的完整運行過程:

  1. 首先使用 stream 方法使用流來處理集合 names
  2. 使用過濾器 filter,過濾出字符串中含有字符 a 的字符串
  3. distinct 進行去重
  4. toList 將以上所有中間操作過后得到的結(jié)果進行匯總,轉(zhuǎn)換成 list 并輸出
public static void main(String[] args) {
    List<String> strings = new ArrayList<>();
    strings.add("asd");
    strings.add("asd");
    strings.add("qwe");
    List<String> names = strings.stream()
            // 過濾
            .filter(d -> {
                return d.contains("a");
            })
            // 去重
            .distinct()
            // 轉(zhuǎn)換成列表
            .toList();
    for (String name : names) System.out.println(name); // 輸出:asd
}

一些常見的終端操作

foreach:消費流中所有元素并使用 lambda,該操作返回 void

count:返回流中的元素個數(shù),返回類型為 long

collect:把流處理結(jié)果返回成一個集合,譬如 toList 方法

進階流

篩選各異的元素

distinct 進行去重

public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 1, 2, 4, 2, 2);
    numbers.stream()
            .filter(i -> i % 2 == 0)
            .distinct()
            .forEach(System.out::println);
}

截斷

limit,做多返回前 n 個元素

public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 1, 2, 4, 2, 2);
    numbers.stream()
            .limit(3)
            .forEach(System.out::println);
}

跳過元素

skip(4) 表示跳過前四個元素,并返回后面所有的元素;

由于代碼都差不多,這里不做過多演示

映射流

map

map 接收一個函數(shù)作為參數(shù),他將對集合中的每個元素應(yīng)用該函數(shù),并返回該函數(shù)規(guī)定的值;

如下代碼使用 map 獲取了每個 dish 的名稱并返回它,由此生成了由 dishname 構(gòu)成的列表

public static void main(String[] args) {
    List<Dish> dishes = new ArrayList<>();
    dishes.add(new Dish("apple", true, 120, Dish.Type.FRUIT));
    dishes.add(new Dish("pork", false, 900, Dish.Type.MEAT));
    dishes.add(new Dish("fish", false, 400, Dish.Type.FISH));
    List<String> dishNames = dishes.stream()
            .map(Dish::getName)
            .toList();
    dishes.forEach(System.out::println);
}

flatMap

map 是將每個元素都映射成了一個流;

flatMap 是將每個元素都放如同一個流中!

以下代碼實現(xiàn):提取單詞表中出現(xiàn)的單詞;

Arrays.stream 可以將集合轉(zhuǎn)換成流的形式;

應(yīng)當(dāng)首先應(yīng)用 map,將元素進行映射后,在使用 flatMap 把這些映射完畢的元素全部裝入一個統(tǒng)一的流里面!

public static void main(String[] args) {
    // 創(chuàng)建單詞表
    String[] words = {"goodbye", "hello", "night"};
    // 將單詞表轉(zhuǎn)換成流的形式
    Stream<String> swords = Arrays.stream(words);
    // 首先使用map,將所有字母都一一分割來開
    List<String> strings = swords.map(word -> word.split(""))
            // 使用扁平map,將提取到的字母裝入一個流中
            .flatMap(Arrays::stream)
            // 字母去重
            .distinct()
            // 轉(zhuǎn)換成列表
            .toList();
    strings.forEach(System.out::println);
}

匹配

anyMatch 能應(yīng)答:流中是否有至少有一個元素能匹配所給定的謂詞(方法引用)

public static void main(String[] args) {
    List<Dish> dishes = Menu.getMenu();
    if(dishes.stream().anyMatch(Dish::isVegetarian)){
        System.out.println("至少有一個素菜!");
    }
}

全匹配與非全匹配

allMatch 方法檢查謂詞能否匹配所有元素;

noneMatch 方法作用與 allMatch 方法完全相反;

Optional

findAny

findAny 方法默認返回一個 Optional<T>

ifPresent 會在值存在的時候執(zhí)行后面的 lambda 函數(shù)

public static void main(String[] args) {
    List<Dish> dishes = Menu.getMenu();
    dishes.stream()
            .filter(Dish::isVegetarian)
            .findAny()
            .ifPresent(d -> System.out.println(d.getName()));
}

findFirst

顧名思義,找到集合中的第一個元素

歸約

求和

下方展示了三種求和方式:

  1. 直接使用 arrays 函數(shù)自帶的 sum 方法求和;
  2. 使用 reduce,參數(shù)一表示初始值,參數(shù)二為對值的操作
  3. 同樣使用 reduce,但是引入了謂詞!
public static void main(String[] args) {
    int[] nums = {1, 2, 3, 4, 5};
    int sum = Arrays.stream(nums).sum();
    int sum2 = Arrays.stream(nums)
            .reduce(0, (a, b) -> a + b);
    int sum3 = Arrays.stream(nums)
            .reduce(0, Integer::sum);
}

歸約相關(guān)闡發(fā)

map+reduce 常被作為一種形式來進行并行化;

使用 reduce 進行的迭代被內(nèi)部抽象化掉了,所以有益于并行的執(zhí)行;

parallelStream 可以方便的進行并行操作,但是也帶來了同步不安全的隱患;

數(shù)值流

使用 mapToInt 返回特化的 IntStream

public static void main(String[] args) {
    List<Dish> dishes = Menu.getMenu();
    int sum = dishes.stream()
            .mapToInt(Dish::getCalories)
            .sum();
}

boxed

將某個特化流轉(zhuǎn)換成一般流,可以使用 boxed 方法

IntStream is = dishes.stream().mapToInt(Dish::getCalories);
Stream<Integer> sis = is.boxed();

range

針對特化流 IntStream 和 LongStream,他們均有 range 和 rangeClose 方法;

range:遍歷范圍內(nèi)所有數(shù)字除了右邊界數(shù)字

rangeClose:遍歷包含右邊界的所有范圍數(shù)字

下面代碼展示了獲取 1-100 內(nèi)所有偶數(shù)的個數(shù)

IntStream evenNumbers = IntStream.rangeClosed(1,100)
        .filter(n->n%2==0);
System.out.println(evenNumbers.count());

構(gòu)建流

創(chuàng)建流的三種方式

Stream.of(xxx) 通過數(shù)值直接構(gòu)建;

Arrays.stream() 數(shù)組創(chuàng)建;

File.lines() 通過獲取的文件內(nèi)容創(chuàng)建;

到此這篇關(guān)于Java流處理stream使用詳解的文章就介紹到這了,更多相關(guān)Java stream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于CXF搭建webService的實例講解

    基于CXF搭建webService的實例講解

    下面小編就為大家?guī)硪黄贑XF搭建webService的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 基于Java中的數(shù)值和集合詳解

    基于Java中的數(shù)值和集合詳解

    下面小編就為大家?guī)硪黄贘ava中的數(shù)值和集合詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 詳解mybatis.generator配上最新的mysql 8.0.11的一些坑

    詳解mybatis.generator配上最新的mysql 8.0.11的一些坑

    這篇文章主要介紹了詳解mybatis.generator配上最新的mysql 8.0.11的一些坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 詳解springboot+mybatis多數(shù)據(jù)源最簡解決方案

    詳解springboot+mybatis多數(shù)據(jù)源最簡解決方案

    本篇文章主要介紹了詳解springboot+mybatis多數(shù)據(jù)源最簡解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java為圖片添加水印并保存實現(xiàn)方法(附帶源碼)

    Java為圖片添加水印并保存實現(xiàn)方法(附帶源碼)

    這篇文章主要介紹了如何使用Java編程語言在圖像上添加文字或圖片水印,并提供了一個簡單的Java程序?qū)崿F(xiàn),文中給出了詳細的代碼示例,需要的朋友可以參考下
    2025-03-03
  • 從java中調(diào)用matlab詳細介紹

    從java中調(diào)用matlab詳細介紹

    這篇文章主要介紹了從java中調(diào)用matlab,有需要的朋友可以參考一下
    2013-12-12
  • Spring中事務(wù)用法示例及實現(xiàn)原理詳解

    Spring中事務(wù)用法示例及實現(xiàn)原理詳解

    這篇文章主要給大家介紹了關(guān)于Spring中事務(wù)用法示例及實現(xiàn)原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 解讀String字符串導(dǎo)致的JVM內(nèi)存泄漏問題

    解讀String字符串導(dǎo)致的JVM內(nèi)存泄漏問題

    這篇文章主要介紹了解讀String字符串導(dǎo)致的JVM內(nèi)存泄漏問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解Java 集合系列(三)—— LinkedList

    詳解Java 集合系列(三)—— LinkedList

    這篇文章主要介紹了Java 集合系列(三)—— LinkedList,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 一文詳解Springboot中filter的原理與注冊

    一文詳解Springboot中filter的原理與注冊

    這篇文章主要為大家詳細介紹了Springboot中filter的原理與注冊的相關(guān)知識,文中的示例代碼講解詳細,對我們掌握SpringBoot有一定的幫助,需要的可以參考一下
    2023-02-02

最新評論

喀喇沁旗| 翁源县| 大埔县| 长丰县| 方城县| 曲周县| 九江县| 呈贡县| 宝应县| 旬阳县| 突泉县| 沅江市| 溧水县| 大庆市| 体育| 土默特左旗| 多伦县| 星子县| 金昌市| 曲靖市| 锡林浩特市| 江阴市| 凤冈县| 内江市| 托克托县| 吉木乃县| 咸丰县| 东宁县| 建昌县| 朝阳区| 汤原县| 房山区| 眉山市| 余干县| 乐都县| 岑溪市| 亳州市| 赣州市| 朔州市| 田阳县| 婺源县|