<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java8的Stream流 map() 方法

科技綠洲 ? 來源:了不起 ? 作者:了不起 ? 2023-09-25 11:06 ? 次閱讀

前言

在日常的開發工作中經常碰到要處理 List 中數據的問題,比如從一個對象集合中獲得對象中的一個屬性的集合。之前我們想到的是遍歷每個元素,然后取出來放到另外一個集合中,比較繁瑣;在 Java8 之后,對集合可以進行 Stream 操作,使上面的處理更簡潔。

概述

Stream 流式處理中有 map() 方法,先看下其定義,該方法在java.util.stream.Stream類中

圖片

可以看到 map() 方法接收一個函數式接口參數,入參有一個 T ,返回一個 Stream 流,這個流是 R 泛型。主要有以下幾點注意,

  • 入參是一個流中的元素;
  • 出參是一個流,且流中是新元素;

用圖表示就是下面的樣子,原始流中有四個圓形圖案,調用 map() 函數后變成了四個五角星圖案,這里的圓形圖案和五角星圖案是一一對應的,也就是原始流中有多少個元素,調用 map() 方法后依舊有多少個元素,唯一改變的是流中的元素類型。

圖片

示例

我們先創建一個實體類 Student.java

@Data
public class Student implements Serializable {
    /**
     * 姓名
     */
    private String name;
    /**
     * 班級
     */
    private String schoolClass;
    /**
     *語文成績
     */
    private Integer chineseScore;
    /**
     * 數學成績
     */
    private Integer mathScore;
}

再創建一個初始化數據的類:

public class DataFactory {
    public static List< Student > initData(){
        List< Student > list= new ArrayList<  >();
        Student s1=new Student();
        s1.setName("湯霖");
        s1.setSchoolClass("小一班");
        s1.setChineseScore(87);
        s1.setMathScore(95);
        list.add(s1);
 
        Student s2=new Student();
        s2.setName("李牧唐");
        s2.setSchoolClass("小二班");
        s2.setChineseScore(98);
        s2.setMathScore(97);
        list.add(s2);
 
        Student s3=new Student();
        s3.setName("顧北辰");
        s3.setSchoolClass("二年級");
        s3.setChineseScore(89);
        s3.setMathScore(94);
        list.add(s3);
 
        Student s4=new Student();
        s4.setName("言言");
        s4.setSchoolClass("小二班");
        s4.setChineseScore(100);
        s4.setMathScore(90);
        list.add(s4);
 
        Student s5=new Student();
        s5.setName("大運");
        s5.setSchoolClass("小三班");
        s5.setChineseScore(96);
        s5.setMathScore(100);
        list.add(s5);
        return list;
    }
}

找出所有的學生姓名

public static void main(String[] args) {
    DataFactory.initData().stream()
        .map(student - > student.getName())
        .forEach(System.out::println);
}

這里使用了 map() 方法,入參是 Student,出參是以 String 為泛型的流,最后使用 forEach 進行了打印,看下結果

圖片

可以看到剛好把所有的學生姓名均打印出來了。如果想把這些學生姓名放到一個List中怎么辦?

將學生姓名放到list中

public static void main(String[] args) {
    //將所有的學生姓名放到list中
    List< String > studentNames = DataFactory.initData().stream()
        .map(student - > student.getName())
        .collect(Collectors.toList());
    for (String studentName : studentNames) {
        System.out.println(studentName);
    }
}

同樣的找出所有的班級,找出所有學生的成績都可類比上面的,可以看到打印出的學生姓名或班級是有重復數據,這個要怎么解決。我們知道在最后是把數據放到 List 中,為了解決重復的問題可以把數據放到 Set 中,利用 Set 的去重功能:

//將學生姓名放到Set中,可以實現去重功能
Set< String > studentNames = DataFactory.initData().stream()
    .map(student - > student.getName())
    .collect(Collectors.toSet());

結果不再打印,有興趣的可以自己試試。

將姓名為“湯霖”的語文成績置為90

現在有這樣一個需求,要把姓名為湯霖學生的語文成績置為90,看下利用 map() 函數怎么做?

public static void main(String[] args) {
    List< Student > students = DataFactory.initData();

    List< Student > studentNames = students.stream().map(student - > {
        if ("湯霖".equals(student.getName())) {
            student.setChineseScore(90);
        }
        return student;
    }).collect(Collectors.toList());

    for (Student studentName : studentNames) {
        System.out.println(studentName);
    }
    //打印老的list
    System.out.println("-----改之前的數據-----");
    for (Student studentName : students) {
        System.out.println(studentName);
    }
}

輸出結果:

圖片

從上面的結果中可以看出,湯霖的語文成績的確被改為了90,這點是沒錯的。再看原數據也被改為了90,上面提到過 map() 方法生成的是一個新流,原始流中的數據也被修改了,因為下面這行代碼是在原始流中元素的基礎上修改的引用類型中的數據,導致的原始流中的數據也會改。

總結

Java8 的 Stream 流 map() 方法是將流中的元素轉換為另外一個流中的元素,轉換前后兩個流的元素個數不發生改變。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    7740

    瀏覽量

    148706
  • 數據
    +關注

    關注

    8

    文章

    6518

    瀏覽量

    87704
  • JAVA
    +關注

    關注

    19

    文章

    2905

    瀏覽量

    103097
  • 函數
    +關注

    關注

    3

    文章

    4049

    瀏覽量

    61392
  • Stream
    +關注

    關注

    0

    文章

    20

    瀏覽量

    7926
收藏 人收藏

    評論

    相關推薦

    Java基礎-Stream-04-Stream終結方法詳解

    JAVA
    電子學習
    發布于 :2022年12月30日 14:11:08

    Java基礎教程Java入門到精通day23_19_Stream中間操作之map

    JAVA
    電子學習
    發布于 :2023年01月13日 12:34:05

    JAVA學習直通車(教程+書籍+100個實例+問題與解答)

    對于Java8的并行并不陌生,沒錯,我們常常用它來執行并行任務,但是由于并行(parallel stream)采用的是享線程池,可能會對我們的性能造成嚴重影響,那怎么處理呢?`
    發表于 10-25 14:35

    java8新特性

    java8為接口聲明添加非抽象方法的實現,也成為拓展方法。
    發表于 11-27 15:54 ?1629次閱讀

    Java Map的幾種循環方式學習總結

    本文檔內容介紹了基于Java Map的幾種循環方式學習總結,供參考
    發表于 03-19 15:51 ?0次下載

    Java并行流存在的問題及解決辦法詳解

    對于從事Java開發的童鞋來說,相信對于Java8的并行流并不陌生,沒錯,我們常常用它來執行并行任務,但是由于并行流(parallel stream)采用的是享線程池,可能會對我們的性能造成嚴重影響,那怎么處理呢?
    發表于 04-03 15:55 ?12次下載

    如何利用Stream API來優化Java代碼

    使用Stream API優化代碼 Java8的新特性主要是Lambda表達式和流,當流和Lambda表達式結合起來一起使用時,因為流申明式處理數據集合的特點,可以讓代碼變得簡潔易讀 放大
    的頭像 發表于 07-26 14:30 ?1156次閱讀

    JAVA8提供了Optional類來優化這種寫法

    這種寫法是比較丑陋的,為了避免上述丑陋的寫法,讓丑陋的設計變得優雅。JAVA8提供了Optional類來優化這種寫法,接下來的正文部分進行詳細說明
    的頭像 發表于 04-24 15:18 ?867次閱讀

    JDK8 Stream數據流效率分析

    StreamJava SE 8類庫中新增的關鍵抽象,它被定義于 java.util.stream (這個包里有若干流類型:Stream 代表對象引用流,此外還有一系列特化流,
    的頭像 發表于 08-17 10:53 ?990次閱讀

    javastream編程調試技巧

      javastream編程給調試帶來了極大的不便,idea 推出了streamtrace功能,可以詳細看到每一步操作的關系、結果,非常方便進行調試。初遇StreamTrace這里簡單將字符串轉成它的字符數,并設置斷點開啟debug模式。
    的頭像 發表于 10-11 11:06 ?1341次閱讀

    怎么使用Java8Stream API比較兩個List的差異呢?

    可以使用Java8Stream API來比較兩個List的差異,并取出不同的對象。
    的頭像 發表于 08-12 11:15 ?1649次閱讀

    List 轉 Map方法

    ; // 構造函數 、 get 、 set } 我們假定 id 字段 是唯一的, 所以我們把 id 作為 Map 的key。 使用 Java 8 之前的方法 在使用Java 8 之前,
    的頭像 發表于 10-09 16:10 ?901次閱讀

    Java8的新特性

    雖然目前Java最新版本都已經到16了,但是絕大部分公司目前用的Java版本都是8,想當初Java8問世后,其Lambda表達式與方法引用可是最亮眼的新特性,目前,這兩個特性也被大家廣
    的頭像 發表于 10-10 17:12 ?319次閱讀

    JavaStream的常用知識

    ?我們都知道,傳統的處理中,每一步我們都需要通過循環控制,邏輯控制,解包,重新裝箱這些工作。 非生產線示意處理圖 這些步驟讓我們的程序的業務邏輯支離破碎,經常處理數據類的小伙伴尤為痛苦。幸運的是,Java8為我們引入了Stream,使用
    的頭像 發表于 10-11 15:45 ?272次閱讀
    <b class='flag-5'>Java</b>的<b class='flag-5'>Stream</b>的常用知識

    為什么需要Streams?它們能取代Java中的for循環嗎?

    Java8的發布是Java歷史上的一個重大時刻。Streams 和 Lambda 被引入,它們現在被廣泛使用。
    的頭像 發表于 11-03 09:39 ?261次閱讀
    為什么需要Streams?它們能取代<b class='flag-5'>Java</b>中的for循環嗎?
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>