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

Java8 Stream flatmap中間操作用法解析

 更新時間:2020年07月15日 10:15:17   作者:像風(fēng)一樣無影無起  
這篇文章主要介紹了Java8 Stream flatmap中間操作用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

stream中的flatmap是stream的一種中間操作,它和stream的map一樣,是一種收集類型的stream中間操作,但是與map不同的是,它可以對stream流中單個元素再進(jìn)行拆分(切片),從另一種角度上說,使用了它,就是使用了雙重for循環(huán)。

查看Stream源碼中flatmap的方法定義:

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

從方法的定義可以看出,其入?yún)⑹且粋€函數(shù)式接口,該接口的返回類型應(yīng)該是Stream< ? extends R > 類型的。

從實際需求中查看如何使用flatmap:

需求:有一個補(bǔ)習(xí)學(xué)校,其中有若干老師教學(xué)若干門課程,現(xiàn)在學(xué)校有關(guān)于數(shù)學(xué)教學(xué)的通知要傳達(dá)給所有學(xué)數(shù)學(xué)的學(xué)生家長,將電子郵件發(fā)送到他們的郵箱中。

注意:一個老師可以教學(xué)多個科目,一個老師可以教學(xué)多個學(xué)生,一個學(xué)生可以報名多個科目,一個學(xué)生可以有多個家長。

數(shù)據(jù)結(jié)構(gòu)(均省略get/set, toString ,構(gòu)造器):

// 老師
public class Teacher {
  private String id;
  private String name;
  private String subject;
}
// 學(xué)生
public class Student {
  private String id;
  private String name;
  private String techId;
  // 重寫hashCode及equals方法(id及name相同就為同一個學(xué)生)
}
// 家長
public class Parents {
  private String id;
  private String name;
  private String chirldId;
  private String email;
}
// 課程
public enum Subject {
  private String value;
  private String desc;
  Subject(String value, String desc) {
    this.value = value;
    this.desc = desc;
  }
  Math("1", "數(shù)學(xué)"),
  Chinese("2", "漢語"),
  Music("3", "音樂"),
  English("4", "英語");
}

實際上的處理也比較簡單:

1、找出教學(xué)科目為“數(shù)學(xué)”的老師;

2、找到這些老師對應(yīng)的學(xué)生;

3、根據(jù)學(xué)生找到對應(yīng)的家長。

直接貼代碼:

public class Test {
  // 模擬數(shù)據(jù)
  public static Student s1 = new Student("1", "zhangsan", "001");
  public static Student s2 = new Student("2", "lisi", "001");
  public static Student s3 = new Student("3", "wangwu", "001");
  public static Student s4 = new Student("4", "zhaoliu", "001");
  public static Student s5 = new Student("6", "tianqi", "001");
  public static Student s6 = new Student("6", "tianqi", "002");
  public static Student s7 = new Student("6", "tianqi", "003");
  public static Teacher t1 = new Teacher("001", "xiaoming", Subject.Math.getValue());
  public static Teacher t2 = new Teacher("002", "lihua", Subject.Music.getValue());
  public static Teacher t3 = new Teacher("003", "hanmeimei", Subject.Math.getValue());
  public static Teacher t4 = new Teacher("004", "lihua", Subject.English.getValue());
  public static List<Student> stus = new ArrayList<>();
  public static List<Teacher> teacs = new ArrayList<>();
  static {
    stus.add(s1);
    stus.add(s2);
    stus.add(s3);
    stus.add(s4);
    stus.add(s5);
    stus.add(s6);
    stus.add(s7);
    teacs.add(t1);
    teacs.add(t2);
    teacs.add(t3);
    teacs.add(t4);
  }
 
 
  public static void main(String[] args) {
    // 找到所有數(shù)學(xué)老師的學(xué)生的家長的電話,并找他們開家長會
    List<Parents> collect = teacs.stream()
        // 過濾數(shù)學(xué)老師
        .filter(t -> Subject.Math.getValue().equals(t.getSubject()))
        // 通過老師找學(xué)生
        .flatMap(t -> stus.stream().filter(s -> s.getTechId().equals(t.getId())))
        // 過濾重復(fù)的學(xué)生(使用student的equals和hashCode方法)
        .distinct()
        // 通過學(xué)生找家長(這里就簡化為創(chuàng)建家長對象)
        .map(s -> {
          Parents p = new Parents();
          p.setId(UUID.randomUUID().toString());
          p.setChirldId(s.getId());
          p.setName(s.getName().toUpperCase() + "'s Parent");
          p.setEmail((int) (Math.random() * 1000000) + "@qq.com");
          return p;
        })
        .collect(Collectors.toList());
    // 打印到控制臺看看
    collect.stream()
        .forEach(System.out::println);
  }
}

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

Parents{id='3d9312eb-0df5-4ec6-998f-94a32c2253b4', name='LISI's Parent', chirldId='2', telNo='844668@qq.com'}
Parents{id='7f0b92f5-872d-4671-982d-ef1b48840ce3', name='WANGWU's Parent', chirldId='3', telNo='563932@qq.com'}
Parents{id='c318bffd-8c6d-4849-8109-9c686c97fb77', name='ZHAOLIU's Parent', chirldId='4', telNo='108022@qq.com'}
Parents{id='a4ff1bbc-c9b6-4ad2-872c-f4df670c7bb6', name='TIANQI's Parent', chirldId='6', telNo='658956@qq.com'}

如果不使用stream,寫該部分代碼的效果,可能還有優(yōu)化的空間,但是不夠使用stream處理方式更為簡潔,方便:

public class Test {
  public static void main(String[] args) {
    List<Parents> pars = new ArrayList<>();
    Set<Student> targetStudents = new HashSet<>();
    for (Teacher t : teacs) {
      if (t.getSubject().equals(Subject.Math.getValue())) {
        for (Student s : stus) {
          if (s.getTechId().equals(t.getId())) {
            targetStudents.add(s);
          }
        }
      }
    }
    for (Student s : targetStudents) {
      Parents p = new Parents();
      p.setId(UUID.randomUUID().toString());
      p.setChirldId(s.getId());
      p.setName(s.getName().toUpperCase() + "'s Parent");
      p.setEmail((int) (Math.random() * 1000000) + "@qq.com");
      pars.add(p);
    }
    for (Parents p : pars) {
      System.out.println(p);
    }
  }
}

再去看stream中的flatmap方法,它的作用就和他的名字flat一樣,對于調(diào)用flatmap的流的每一個元素,執(zhí)行flatmap入?yún)⒅械暮瘮?shù)式方法,由于該函數(shù)式方法必須返回一個stream<T>類型的流,這樣對于調(diào)用flatmap的操作來說,就收集了另一種類型(<T>)的流,并在后續(xù)的操作中將<T>類型進(jìn)行合并,最終產(chǎn)生一個stream<T>的流,而不是一個stream<stream<T>>類型的流。

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

相關(guān)文章

  • Spring-data-redis操作redis知識總結(jié)

    Spring-data-redis操作redis知識總結(jié)

    這篇文章主要介紹了Spring-data-redis操作redis知識總結(jié),spring-data-redis是spring-data模塊的一部分,專門用來支持在spring管理項目對redis的操作。
    2017-04-04
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(60)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(60)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • 聊聊Mybatis中sql語句不等于的表示

    聊聊Mybatis中sql語句不等于的表示

    這篇文章主要介紹了Mybatis中sql語句不等于的表示方式,具有很好的參考價值,希望對大家有所幫助。
    2021-07-07
  • SpringBoot動態(tài)導(dǎo)出word文檔實整教程(復(fù)制即可使用)

    SpringBoot動態(tài)導(dǎo)出word文檔實整教程(復(fù)制即可使用)

    在我們做項目的時候會需要把數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出到word當(dāng)中,下面這篇文章主要給大家介紹了關(guān)于SpringBoot動態(tài)導(dǎo)出word文檔實整教程的相關(guān)資料,文中的代碼復(fù)制即可使用,需要的朋友可以參考下
    2023-06-06
  • IDEA 工程里 new不出來Vue文件的圖文解決方案

    IDEA 工程里 new不出來Vue文件的圖文解決方案

    這篇文章主要介紹了IDEA 工程里 new不出來Vue文件的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java集合框架之List ArrayList LinkedList使用詳解刨析

    Java集合框架之List ArrayList LinkedList使用詳解刨析

    早在 Java 2 中之前,Java 就提供了特設(shè)類。比如:Dictionary, Vector, Stack, 和 Properties 這些類用來存儲和操作對象組。雖然這些類都非常有用,但是它們?nèi)鄙僖粋€核心的,統(tǒng)一的主題。由于這個原因,使用 Vector 類的方式和使用 Properties 類的方式有著很大不同
    2021-10-10
  • 淺談spring中isolation和propagation的用法

    淺談spring中isolation和propagation的用法

    這篇文章主要介紹了淺談spring中isolation 和propagation的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java 生成帶Logo和文字的二維碼

    Java 生成帶Logo和文字的二維碼

    這篇文章主要介紹了Java 生成帶Logo和文字的二維碼的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標(biāo)點(diǎn)輸入無效的完美解決方法

    Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標(biāo)點(diǎn)輸入無效的完美解決方法

    Mac OS X 下基于 Java 的程序會出現(xiàn)中文標(biāo)點(diǎn)輸入無效的問題,在中文輸入法狀態(tài),可以輸入中文字,但輸入中文標(biāo)點(diǎn)最后上去的是英文標(biāo)點(diǎn).這篇文章主要介紹了Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標(biāo)點(diǎn)輸入無效的完美解決方法,需要的朋友可以參考下
    2016-10-10
  • Java之策略模式比較器案例講解

    Java之策略模式比較器案例講解

    這篇文章主要介紹了Java之策略模式比較器案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論

江津市| 天柱县| 苏尼特左旗| 仪陇县| 长泰县| 民权县| 翁牛特旗| 龙岩市| 许昌市| 淄博市| 大余县| 新余市| 讷河市| 白河县| 福建省| 渑池县| 青海省| 重庆市| 古交市| 株洲县| 奎屯市| 阜新市| 海口市| 勐海县| 新乐市| 舟山市| 黄梅县| 尉氏县| 赫章县| 陇川县| 台中县| 离岛区| 马龙县| 清涧县| 清河县| 任丘市| 黄龙县| 芦溪县| 尼木县| 凌源市| 炎陵县|