溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java8中Stream的常用方法有哪些

發(fā)布時(shí)間:2022-01-07 17:09:15 來源:億速云 閱讀:121 作者:iii 欄目:編程語言

本文小編為大家詳細(xì)介紹“Java8中Stream的常用方法有哪些”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java8中Stream的常用方法有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

 簡介

java8也出來好久了,接口默認(rèn)方法,lambda表達(dá)式,函數(shù)式接口,Date  API等特性還是有必要去了解一下。比如在項(xiàng)目中經(jīng)常用到集合,遍歷集合可以試下lambda表達(dá)式,經(jīng)常還要對集合進(jìn)行過濾和排序,Stream就派上用場了。用習(xí)慣了,不得不說真的很好用。

Stream作為java8的新特性,基于lambda表達(dá)式,是對集合對象功能的增強(qiáng),它專注于對集合對象進(jìn)行各種高效、便利的聚合操作或者大批量的數(shù)據(jù)操作,提高了編程效率和代碼可讀性。

Stream的原理:將要處理的元素看做一種流,流在管道中傳輸,并且可以在管道的節(jié)點(diǎn)上處理,包括過濾篩選、去重、排序、聚合等。元素流在管道中經(jīng)過中間操作的處理,最后由最終操作得到前面處理的結(jié)果。

集合有兩種方式生成流:

  • stream() − 為集合創(chuàng)建串行流

  • parallelStream() - 為集合創(chuàng)建并行流

Java8中Stream的常用方法有哪些

上圖中是Stream類的類結(jié)構(gòu)圖,里面包含了大部分的中間和終止操作。

中間操作主要有以下方法(此類型方法返回的都是Stream):map (mapToInt, flatMap 等)、 filter、 distinct、  sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

終止操作主要有以下方法:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、  count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

舉例說明

首先為了說明Stream對對象集合的操作,新建一個Student類(學(xué)生類),覆寫了equals()和hashCode()方法

public class Student {      private Long id;      private String name;      private int age;      private String address;      public Student() {}      public Student(Long id, String name, int age, String address) {         this.id = id;         this.name = name;         this.age = age;         this.address = address;     }      @Override     public String toString() {         return "Student{" +                 "id=" + id +                 ", name='" + name + '\'' +                 ", age=" + age +                 ", address='" + address + '\'' +                 '}';     }      @Override     public boolean equals(Object o) {         if (this == o) return true;         if (o == null || getClass() != o.getClass()) return false;         Student student = (Student) o;         return age == student.age &&                 Objects.equals(id, student.id) &&                 Objects.equals(name, student.name) &&                 Objects.equals(address, student.address);     }      @Override     public int hashCode() {         return Objects.hash(id, name, age, address);     }      public Long getId() {         return id;     }      public void setId(Long id) {         this.id = id;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getAge() {         return age;     }      public void setAge(int age) {         this.age = age;     }      public String getAddress() {         return address;     }      public void setAddress(String address) {         this.address = address;     }  }

filter(篩選)

public static void main(String [] args) {          Student s1 = new Student(1L, "肖戰(zhàn)", 15, "浙江");         Student s2 = new Student(2L, "王一博", 15, "湖北");         Student s3 = new Student(3L, "楊紫", 17, "北京");         Student s4 = new Student(4L, "李現(xiàn)", 17, "浙江");         List<Student> students = new ArrayList<>();         students.add(s1);         students.add(s2);         students.add(s3);         students.add(s4);          List<Student> streamStudents = testFilter(students);         streamStudents.forEach(System.out::println);     }     /**      * 集合的篩選      * @param students      * @return      */     private static List<Student> testFilter(List<Student> students) {         //篩選年齡大于15歲的學(xué)生 //        return students.stream().filter(s -> s.getAge()>15).collect(Collectors.toList());         //篩選住在浙江省的學(xué)生         return students.stream().filter(s ->"浙江".equals(s.getAddress())).collect(Collectors.toList());     }

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

這里我們創(chuàng)建了四個學(xué)生,經(jīng)過filter的篩選,篩選出地址是浙江的學(xué)生集合。

map(轉(zhuǎn)換)

public static void main(String [] args) {         Student s1 = new Student(1L, "肖戰(zhàn)", 15, "浙江");        Student s2 = new Student(2L, "王一博", 15, "湖北");        Student s3 = new Student(3L, "楊紫", 17, "北京");        Student s4 = new Student(4L, "李現(xiàn)", 17, "浙江");        List<Student> students = new ArrayList<>();        students.add(s1);        students.add(s2);        students.add(s3);        students.add(s4);         testMap(students);    }     /**     * 集合轉(zhuǎn)換     * @param students     * @return     */    private static void testMap(List<Student> students) {        //在地址前面加上部分信息,只獲取地址輸出        List<String> addresses = students.stream().map(s ->"住址:"+s.getAddress()).collect(Collectors.toList());        addresses.forEach(a ->System.out.println(a));    }

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

Java8中Stream的常用方法有哪些

map就是將對應(yīng)的元素按照給定的方法進(jìn)行轉(zhuǎn)換。

distinct(去重)

public static void main(String [] args) {       testDistinct1();    }     /**     * 集合去重(基本類型)     */    private static void testDistinct1() {        //簡單字符串的去重        List<String> list = Arrays.asList("111","222","333","111","222");        list.stream().distinct().forEach(System.out::println);    }

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

Java8中Stream的常用方法有哪些

public static void main(String [] args) {        testDistinct2();     }      /**      * 集合去重(引用對象)      */     private static void testDistinct2() {         //引用對象的去重,引用對象要實(shí)現(xiàn)hashCode和equal方法,否則去重?zé)o效         Student s1 = new Student(1L, "肖戰(zhàn)", 15, "浙江");         Student s2 = new Student(2L, "王一博", 15, "湖北");         Student s3 = new Student(3L, "楊紫", 17, "北京");         Student s4 = new Student(4L, "李現(xiàn)", 17, "浙江");         Student s5 = new Student(1L, "肖戰(zhàn)", 15, "浙江");         List<Student> students = new ArrayList<>();         students.add(s1);         students.add(s2);         students.add(s3);         students.add(s4);         students.add(s5);         students.stream().distinct().forEach(System.out::println);     }

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

Java8中Stream的常用方法有哪些

可以看出,兩個重復(fù)的“肖戰(zhàn)”同學(xué)進(jìn)行了去重,這不僅因?yàn)槭褂昧薲istinct()方法,而且因?yàn)镾tudent對象重寫了equals和hashCode()方法,否則去重是無效的。

sorted(排序)

public static void main(String [] args) {        testSort1();   }    /**    * 集合排序(默認(rèn)排序)    */   private static void testSort1() {       List<String> list = Arrays.asList("333","222","111");       list.stream().sorted().forEach(System.out::println);   }

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

Java8中Stream的常用方法有哪些

public static void main(String [] args) {      testSort2(); }  /**  * 集合排序(指定排序規(guī)則)  */ private static void testSort2() {     Student s1 = new Student(1L, "肖戰(zhàn)", 15, "浙江");     Student s2 = new Student(2L, "王一博", 15, "湖北");     Student s3 = new Student(3L, "楊紫", 17, "北京");     Student s4 = new Student(4L, "李現(xiàn)", 17, "浙江");     List<Student> students = new ArrayList<>();     students.add(s1);     students.add(s2);     students.add(s3);     students.add(s4);     students.stream()             .sorted((stu1,stu2) ->Long.compare(stu2.getId(), stu1.getId()))             .sorted((stu1,stu2) -> Integer.compare(stu2.getAge(),stu1.getAge()))             .forEach(System.out::println); }

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

Java8中Stream的常用方法有哪些

上面指定排序規(guī)則,先按照學(xué)生的id進(jìn)行降序排序,再按照年齡進(jìn)行降序排序

limit(限制返回個數(shù))

public static void main(String [] args) {         testLimit();    }     /**     * 集合limit,返回前幾個元素     */    private static void testLimit() {        List<String> list = Arrays.asList("333","222","111");        list.stream().limit(2).forEach(System.out::println);    }

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

Java8中Stream的常用方法有哪些

skip(刪除元素)

public static void main(String [] args) {         testSkip();    }     /**     * 集合skip,刪除前n個元素     */    private static void testSkip() {        List<String> list = Arrays.asList("333","222","111");        list.stream().skip(2).forEach(System.out::println);    }

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

Java8中Stream的常用方法有哪些

reduce(聚合)

public static void main(String [] args) {         testReduce();     }     /**      * 集合reduce,將集合中每個元素聚合成一條數(shù)據(jù)      */     private static void testReduce() {         List<String> list = Arrays.asList("歡","迎","你");         String appendStr = list.stream().reduce("北京",(a,b) -> a+b);         System.out.println(appendStr);     }

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

Java8中Stream的常用方法有哪些

min(求最小值)

public static void main(String [] args) {       testMin();   }    /**    * 求集合中元素的最小值    */   private static void testMin() {       Student s1 = new Student(1L, "肖戰(zhàn)", 14, "浙江");       Student s2 = new Student(2L, "王一博", 15, "湖北");       Student s3 = new Student(3L, "楊紫", 17, "北京");       Student s4 = new Student(4L, "李現(xiàn)", 17, "浙江");       List<Student> students = new ArrayList<>();       students.add(s1);       students.add(s2);       students.add(s3);       students.add(s4);       Student minS = students.stream().min((stu1,stu2) ->Integer.compare(stu1.getAge(),stu2.getAge())).get();       System.out.println(minS.toString());   }

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

Java8中Stream的常用方法有哪些

上面是求所有學(xué)生中年齡最小的一個,max同理,求最大值。

anyMatch/allMatch/noneMatch(匹配)

public static void main(String [] args) {        testMatch();    }     private static void testMatch() {        Student s1 = new Student(1L, "肖戰(zhàn)", 15, "浙江");        Student s2 = new Student(2L, "王一博", 15, "湖北");        Student s3 = new Student(3L, "楊紫", 17, "北京");        Student s4 = new Student(4L, "李現(xiàn)", 17, "浙江");        List<Student> students = new ArrayList<>();        students.add(s1);        students.add(s2);        students.add(s3);        students.add(s4);        Boolean anyMatch = students.stream().anyMatch(s ->"湖北".equals(s.getAddress()));        if (anyMatch) {            System.out.println("有湖北人");        }        Boolean allMatch = students.stream().allMatch(s -> s.getAge()>=15);        if (allMatch) {            System.out.println("所有學(xué)生都滿15周歲");        }        Boolean noneMatch = students.stream().noneMatch(s -> "楊洋".equals(s.getName()));        if (noneMatch) {            System.out.println("沒有叫楊洋的同學(xué)");        }    }

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

Java8中Stream的常用方法有哪些

anyMatch:Stream 中任意一個元素符合傳入的 predicate,返回 true

allMatch:Stream 中全部元素符合傳入的 predicate,返回 true

noneMatch:Stream 中沒有一個元素符合傳入的 predicate,返回 true

讀到這里,這篇“Java8中Stream的常用方法有哪些”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI