Java8 stream 處理(lǐ) List 交集、差集、去重等
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)是:
class01.stream().filter(class02::contains)
的(de)filter()
會 保留 符合表達式的(de)結果,這(zhè)裏面表達式的(de)内容是 2班和(hé)1班名字相同的(de)同學forEach是遍曆集合,代替了(le)for循環,代碼更爲簡潔
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à):
用(yòng)集合創建Stream
List<String> list=Arrays.asList("a","b","c");
//創建順序流
Stream<String> stream=list.stream();
//創建并行流
Stream<String> parallelStream=list.parallelStream();用(yòng)數組
Arrays.stream(array)
創建Streamint[] array={1,2,3,4,5};
IntStream stream=Arrays.stream(array);用(yòng)
Stream<T> of(T... values)
創建StreamStream<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]
掃一掃,關注我們
相關新聞
- JAVA開發之hashMap時(shí)間複雜(zá)度分(fēn)析
- 微信小程序開發偶發性獲取手機号失敗解決方案
- 使用(yòng)JAVA開發小程序時(shí),如何防止接口被頻(pín)繁請求
- app開發制作過程中,使用(yòng)JAVA注解方式,實現權限功能開發
- springBoot小程序開發的(de)項目,後台如何優雅的(de)停止進程
- JAVA知識十連問
- JAVA語言小程序開發之hashMap原理(lǐ)詳解
- mysql常見錯誤詳解
- 小程序open-data組件将于2022年2月(yuè)21日24時(shí)起···
- 爲什(shén)麽重寫了(le)equals方法,就必須重寫hashCode