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

手把手帶你了解Java-Stream流方法學(xué)習(xí)及總結(jié)

 更新時(shí)間:2021年08月19日 14:56:17   作者:Java架構(gòu)-大仙  
這篇文章主要介紹了通過實(shí)例了解JavaStream流的方法學(xué)習(xí)和總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

Stream是一個(gè)來自數(shù)據(jù)源的元素隊(duì)列并支持聚合操作,其中具有以下特性:

  • Stream只負(fù)責(zé)計(jì)算,不存儲(chǔ)任何元素,元素是特定類型的對(duì)象,形成一個(gè)隊(duì)列
  • 數(shù)據(jù)源可以實(shí)集合、數(shù)組、I/O channel、generator等
  • 聚合操作有類似SQL的:filter、map、match、sorted等操作
  • Stream流的執(zhí)行類似于懶加載,用戶使用時(shí)才執(zhí)行相應(yīng)操作
  • 可消費(fèi)性;Stream只能被消費(fèi)一次,被消費(fèi)后需要重新生成

本文總結(jié)了部分在日常開發(fā)中經(jīng)常接觸到的一些Stream流相關(guān)的方法,不足之處或有錯(cuò)誤歡迎留評(píng),總結(jié)的幾個(gè)方法如下:

  • void forEach() : 迭代流中的數(shù)據(jù)
  • Stream map() : 用于映射每個(gè)元素到對(duì)應(yīng)的結(jié)果
  • Stream filter() : 條件過濾器
  • Stream sorted() : 排序
  • R collect() : 流數(shù)據(jù) -> 集合/數(shù)組
  • 待補(bǔ)充…

forEach()

forEach()源碼:

void forEach(Consumer<!--? super T--> action);

Stream().forEach() : 迭代流中的數(shù)據(jù)

forEach() 的返回類型為void,不會(huì)產(chǎn)生新的流

舉個(gè)栗子:

public void testForEach() {
     /**
      * 使用forEach()內(nèi)部迭代
      * ints()表示整數(shù)類型
      * limit()表示限制流個(gè)數(shù)(次數(shù))
      */
     Random random = new Random();
     random.ints().limit(10).forEach(System.out::println);
}

運(yùn)行結(jié)果:


再舉個(gè)靈活一點(diǎn)的栗子:

public void testForEach() {
    /**
     * 使用forEach()轉(zhuǎn)換集合類型,如List->Map
     */
    AtomicInteger i = new AtomicInteger();//原子類型
    Map<Integer,String> map = new HashMap<>();
    List<String> list = new ArrayList<>(Arrays.asList("Hello",",","world"));
    list.stream().forEach(s->{
        map.put(i.getAndIncrement(),s);
    });
}

對(duì)于forEach()方法在本人日常開發(fā)中常用于:

  • 使用內(nèi)循環(huán)對(duì)集合進(jìn)行遍歷
  • 使用foreach方法將List轉(zhuǎn)為Map形式

map()

map()源碼:

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

Stream().map() 用于映射每個(gè)元素到對(duì)應(yīng)的結(jié)果

返回類型為Stream,map()會(huì)產(chǎn)生新的流并返回

舉個(gè)栗子:

public void testMap(){
    /**
     * map()獲取list每個(gè)元素的平方值
     * distinct()去重操作
     * collect()將map()產(chǎn)生的新的流轉(zhuǎn)為List類型
     */
    List<Integer> list = Arrays.asList(1,2,3);
    list.stream().map(num -> num * num)
                 .distinct()
                 .collect(Collectors.toList())
                 .forEach(System.out::println);
}

filter()

filter()源碼:

Stream<T> filter(Predicate<? super T> predicate);

Stream().filter()為條件過濾器

舉個(gè)栗子:

public void testFilter(){
    /**
     * filter()過濾空字符串
     * count()統(tǒng)計(jì)符合條件的個(gè)數(shù),返回類型long
     */
    List<String> list = new ArrayList<>(Arrays.asList("ab","","abc","","acd"));
    long count = list.stream()
                     .filter(str -> str.isEmpty())
                     .count();
}

sorted()

sorted()源碼:

Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);

Stream支持兩種方式的排序:

無參方法默認(rèn)為自然排序sorted(Comparator comp) 按自定義比較器進(jìn)行排序

仍然是舉個(gè)栗子:

1)無參方法

public void testSorted(){
    /**
     * sort()無參默認(rèn)為自然排序
     * 返回類型Stream 會(huì)產(chǎn)生新的流
     */
    List<String> list = new ArrayList<>(Arrays.asList("aaa","ccc","bbb"));
    list.stream().sorted().forEach(System.out::println);
}

執(zhí)行結(jié)果:

2)帶參方法(User類由name和age組成)

  • 先比較年齡,按從小到大排序
  • 若年齡相等,則按性名自然排序
public void testSorted(){
    /**
     * sort(Comparator comp)按自定義比較器進(jìn)行排序
     * 返回類型同樣是Stream 會(huì)產(chǎn)生新的流
     */
    List<User> userList = new ArrayList<>(Arrays.asList(
       new User("zhangsan",22),
       new User("wangwu",22),
       new User("badao",32),
       new User("kongfu",16)
    ));
    Stream<User> sorted = userList.stream().sorted((x, y) -> {
        if (x.getAge() == y.getAge()) { // 使用流中的序列兩兩進(jìn)行比較
            return x.getName().compareTo(y.getName());
        } else {
            return x.getAge() - y.getAge();//順序
            // y.getAge() - x.getAge() 為逆序
        }
    });
    sorted.forEach(System.out::println);
}

執(zhí)行結(jié)果:

collect()

collect()源碼:

<R> R collect(Supplier<R> supplier,
              BiConsumer<R, ? super T> accumulator,
              BiConsumer<R, R> combiner);

stream().collect() 由三個(gè)參數(shù)構(gòu)成 :

1.Supplier 生產(chǎn)者,返回最終

2.結(jié)果BiConsumer<R, ? super T> accumulator,累加器 :

其中 R 為要返回的集合, ? super T 為遍歷過程中的每個(gè)參數(shù),相當(dāng)于add操作

3.BiConsumer<R,R> combiner,合并器 :

有并行流時(shí)才會(huì)使用,相當(dāng)于將第二部操作形成的list添加到最終的list,addAll操作

舉個(gè)栗子:

1)new()

public void testCollect(){

    Stream<String> stream = Stream.of("hello","world","hello,world");
	
    // new()
    List<String> list = stream.collect(Collectors.toList());//List
    // 指定集合類型,如ArrayList
    ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));
    //Set
    stream.collect(Collectors.toSet());
    // 指定HashSet
    HashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));
    // 拼接字符串
    String str = stream.collect(Collectors.joining());

2)new() -> add() -> addAll()

public void testCollect(){
    /**
     * 參數(shù)傳遞行為相當(dāng)于: new() -> add() -> addAll()
     */
    Stream<String> stream = Stream.of("hello","world","hello,world");
    // new() -> add() -> addAll()完整演示
    HashMap<String,String> map = stream.collect(HashMap::new,(x,y)->{
        x.put(y,y); // x 為集合,y 為當(dāng)前遍歷元素,以當(dāng)前遍歷元素作為kv
    },HashMap::putAll);
    map.forEach((x,y)->{
        System.out.println(x+" : "+y);
    });
    

執(zhí)行結(jié)果:

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • SpringBoot多環(huán)境開發(fā)與日志小結(jié)

    SpringBoot多環(huán)境開發(fā)與日志小結(jié)

    這篇文章主要介紹了SpringBoot多環(huán)境開發(fā)與日志,下面給大家說一下如何基于多環(huán)境開發(fā)做配置獨(dú)立管理,務(wù)必掌握,需要的朋友可以參考下
    2022-08-08
  • SpringBoot的配置文件application.yml及加載順序詳解

    SpringBoot的配置文件application.yml及加載順序詳解

    這篇文章主要介紹了SpringBoot的配置文件application.yml及加載順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java中的關(guān)鍵字volatile詳解

    Java中的關(guān)鍵字volatile詳解

    這篇文章主要介紹了Java中的關(guān)鍵字volatile,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 解讀nacos獲取配置文件的大致過程

    解讀nacos獲取配置文件的大致過程

    這篇文章主要介紹了nacos獲取配置文件的大致過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • JAVA調(diào)用SAP WEBSERVICE服務(wù)實(shí)現(xiàn)流程圖解

    JAVA調(diào)用SAP WEBSERVICE服務(wù)實(shí)現(xiàn)流程圖解

    這篇文章主要介紹了JAVA調(diào)用SAP WEBSERVICE服務(wù)實(shí)現(xiàn)流程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 使用自定義參數(shù)解析器同一個(gè)參數(shù)支持多種Content-Type

    使用自定義參數(shù)解析器同一個(gè)參數(shù)支持多種Content-Type

    這篇文章主要介紹了使用自定義參數(shù)解析器同一個(gè)參數(shù)支持多種Content-Type的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Intellij idea下使用不同tomcat編譯maven項(xiàng)目的服務(wù)器路徑方法詳解

    Intellij idea下使用不同tomcat編譯maven項(xiàng)目的服務(wù)器路徑方法詳解

    今天小編就為大家分享一篇關(guān)于Intellij idea下使用不同tomcat編譯maven項(xiàng)目的服務(wù)器路徑方法詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • IntelliJ IDEA 小技巧之Bookmark(書簽)的使用

    IntelliJ IDEA 小技巧之Bookmark(書簽)的使用

    這篇文章主要介紹了IntelliJ IDEA 小技巧之Bookmark(書簽)的使用,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 淺談一下Java中的堆和棧

    淺談一下Java中的堆和棧

    這篇文章主要介紹了一下Java中的堆和棧,Java數(shù)據(jù)類型在執(zhí)行過程中存儲(chǔ)在兩種不同形式的內(nèi)存中:棧和堆,它們通常由運(yùn)行Java虛擬機(jī)(JVM)的底層平臺(tái)維護(hù),需要的朋友可以參考下
    2023-04-04
  • javafx 如何將項(xiàng)目打包為 Windows 的可執(zhí)行文件exe

    javafx 如何將項(xiàng)目打包為 Windows 的可執(zhí)行文件exe

    文章介紹了三種將JavaFX項(xiàng)目打包為.exe文件的方法:方法1使用jpackage(適用于JDK14及以上版本),方法2使用Launch4j(適用于所有JDK版本),方法3使用InnoSetup(用于創(chuàng)建安裝包),每種方法都有其特點(diǎn)和適用范圍,可以根據(jù)項(xiàng)目需求選擇合適的方法,感興趣的朋友一起看看吧
    2025-01-01

最新評(píng)論

平原县| 甘谷县| 栾川县| 喜德县| 关岭| 天柱县| 建阳市| 德江县| 井研县| 林周县| 东兰县| 肥东县| 额敏县| 乌海市| 垦利县| 曲水县| 平南县| 平凉市| 栾川县| 玛沁县| 河间市| 汝城县| 嘉荫县| 宜兰市| 海阳市| 彰化县| 轮台县| 华池县| 炎陵县| 阳山县| 鹤山市| 莱阳市| 景泰县| 临夏市| 吉安市| 康平县| 额敏县| 寿宁县| 灯塔市| 睢宁县| 布拖县|