Java8 stream 處理(lǐ) List 交集、差集、去重等

發布時(shí)間:2022-02-19 15:30:26 作者:King 來(lái)源:本站 浏覽量(2529) 點贊(134)
摘要:Java8的(de)新特性——Stream常用(yòng)于處理(lǐ)集合,它不會改變集合原有的(de)結構,優點是Stream的(de)代碼會比用(yòng)for循環處理(lǐ)簡潔不少本文主要說的(de)是:獲取兩個(gè)List集合的(de)交集、差集、去重以及list.stream()構造方法一、兩個(gè)集合的(de)交集例如:找出兩個(gè)班 名字相同的(de)學生publicclassStudent{privateString

Java8的(de)新特性——Stream常用(yòng)于處理(lǐ)集合,它不會改變集合原有的(de)結構,優點是Stream的(de)代碼會比用(yòng)for循環處理(lǐ)簡潔不少

本文主要說的(de)是:獲取兩個(gè)List集合的(de)交集差集去重以及list.stream()構造方法

一、兩個(gè)集合的(de)交集

例如:找出兩個(gè)班 名字相同的(de)學生

public class Student {
 
 private String studentNo;
 //名字
    private String studentName;
 
 public Student(String studentNo, String studentName) {
        this.studentNo = studentNo;
        this.studentName = studentName;
    }
 
 //對(duì)象的(de)比較涉及到equals()的(de)重寫, 這(zhè)裏僅僅比較studentName是否相同
 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return studentName.equals(student.getStudentName());
    }
 
 // set()和(hé)get()方法均省略..
}

學生是個(gè)對(duì)象實例,我們要比較的(de)是名字是否相同,僅需要重寫equals()方法即可(kě)

找交集

@Test
public void test(){
 // 1班的(de)學生
 List<Student> class01=new ArrayList<>();
    class01.add(new Student("1","小明(míng)"));
    class01.add(new Student("2","趙鐵柱")); 
 
 // 2班的(de)學生
 List<Student> class02=new ArrayList<>();
    class02.add(new Student("1","趙鐵柱"));

 // 找兩個(gè)班名字相同的(de)同學(取交集),比較用(yòng)的(de)是重寫的(de)equals()
 List<Student> sameName=class01.stream().filter(class02::contains).collect(Collectors.toList());
 sameName.stream().forEach(student->System.out.println(student.getStudentName()+" "));
 
 //output : 趙鐵柱
}    

需要注意的(de)是:

  1. class01.stream().filter(class02::contains)的(de)filter()會 保留 符合表達式的(de)結果,這(zhè)裏面表達式的(de)内容是 2班和(hé)1班名字相同的(de)同學

  2. forEach是遍曆集合,代替了(le)for循環,代碼更爲簡潔

  3. collect(Collectors.toList())collect(Collectors.toSet())collect(Collectors.toMap())将Stream的(de)數據歸集到List、Map、Set等集合

二、差集

輸出結果:b c

@Test
public void test(){
 List<String> list01=Arrays.asList("a","b","c");
    List<String> list02=Arrays.asList("a","e","f");
 
 //list01和(hé)list02的(de)差集, 僅保留了(le) b,c
    List<String> result=list01.stream().filter(word->!list02.contains(word)).collect(Collectors.toList());
    result.stream().forEach(word->System.out.print(word+" "));
}

表達式 list01.stream().filter(word-> ! list02.contains(word)),要找的(de)元素,它的(de)特征是隻存在list01中,但不存在list02中,! list02.contains(word)就是說這(zhè)個(gè)元素不在list02中

三、去重

輸出結果:a b c

List<String> list=Arrays.asList("a","b","c","a");
List<String> distinct=list.stream().distinct().collect(Collectors.toList());
distinct.stream().forEach(word->System.out.print(word+" ")); 

删除了(le)重複的(de)字符"a"

四、list.stream()構造方法

可(kě)能有朋友對(duì)list.stream()有些疑惑,它是個(gè)Stream的(de)構造方法,Stream的(de)構造方法如下(xià):

  1. 用(yòng)集合創建Stream

    List<String> list=Arrays.asList("a","b","c");
    //創建順序流
    Stream<String> stream=list.stream();
    //創建并行流
    Stream<String> parallelStream=list.parallelStream();
  2. 用(yòng)數組Arrays.stream(array)創建Stream

    int[] array={1,2,3,4,5};
    IntStream stream=Arrays.stream(array);
  3. 用(yòng)Stream<T> of(T... values)創建Stream

    Stream<Integer> stream=Stream.of(1,2,3,4,5);

常用(yòng)的(de)是上面這(zhè)三種,另外還(hái)有iterate()generate(),後者是生成随機數,兩個(gè)構造方法均産生無限流(即元素的(de)個(gè)數是無限的(de))。

如果要求數量有限,則需要用(yòng) limit 來(lái)限制,如:

Stream<Integer> stream=Stream.iterate(0,num->num+3).limit(10)

打印了(le)[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]


微信

掃一掃,關注我們

感興趣嗎?

歡迎聯系我們,我們願意爲您解答(dá)任何有關網站疑難問題!

【如有開發需求】那就聯系我們吧

搜索千萬次不如咨詢1次

承接:網站建設,手機網站,響應式網站,小程序開發,原生android開發等業務

立即咨詢 16605125102