java8 list根據物件屬性去重_Java8 流操作
阿新 • • 發佈:2021-01-09
技術標籤:java8 list根據物件屬性去重
Java8 流操作整理
分類
Stream操作分類
無狀態:指元素的處理不受之前元素的影響;
有狀態:指該操作只有拿到所有元素之後才能繼續下去。
非短路操作:指必須處理所有元素才能得到最終結果;
短路操作:指遇到某些符合條件的元素就可以得到最終結果,如 A || B,只要A為true,則無需判斷B的結果
用法
建立
//通過Collection集合List<String> list = new ArrayList<>();Stream<String> stream = list.stream();//陣列轉化String[] list = new String[5];Stream<String> stream = Arrays.stream(list);//Stream中的靜態方法:of()、iterate()、generate()Stream stream1 = Stream.of(1,2,3,4,5,6);Stream stream2 = Stream.iterate(0, x -> x).limit(3);Streamstream3=Stream.generate(Math::random).limit(4);
流中間操作
篩選與切片
filter 過濾、distinct 去重
list.stream() //將年份大於10的留下 .filter(x->x.getYear()>10) //去重,由於list內是物件,則通過hash值 .distinct();
skip 跳過、limit 取出
skip和limit共同使用可以實現分頁效果,類似於mysql的limit關鍵字
list.stream() //跳過前兩條 .skip(2) //取出結果的1-3條 .limit(3);
對映
map、flatMap
map:產生的結果只會一對一
flatMap:產生一對多結果
Listlist = Arrays.asList("Hello", "World");//map產生的結果數量不會增多List mapResult = list.stream() .map(x -> x.split("")) .collect(toList());//flatMap產生的結果數量會增多List flatMapResult = list.stream() .flatMap(x -> Arrays.stream(x.split(""))).collect(toList());
排序
sorted()、sorted(Comparator com)
sorted():自然排序,流中元素需實現Comparable介面
sorted(Comparator com):定製排序,自定義Comparator排序器
//傳入比較器Stream sorted = list1.stream().sorted((o1, o2) -> { return o2.getId() - o1.getId();});
消費
peek 賦值
Stream sorted = list1.stream() //修改資料 .peek(x->x.setId(5));
匹配操作
anyMatch、allMatch、noneMatch、findFirst、…
anyMatch:只要有一個匹配上
allMatch:每一個匹配上
noneMatch:沒有一個匹配上
findFirst:返回流中第一個元素
findAny:返回流中的任意元素
count:返回流中元素的總個數
max:返回流中元素最大值
min:返回流中元素最小值
boolean b = list.stream() //有一個符合條件返回true .anyMatch(x -> x.getId() > 1);
程式碼彙總後的例子:
@[email protected]@AllArgsConstructor/** * 學生 */class Student{ private String name; private Integer age; private Integer type; private BigDecimal money;}
Student s1 = new Student("aa", 10,1,new BigDecimal(1000));Student s2 = new Student("bb", 20,1,new BigDecimal(2000));Student s3 = new Student("cc", 25,2,new BigDecimal(3000));Student s4 = new Student("dd", 30,2,new BigDecimal(2500));list = Arrays.asList(s1, s2, s3,s4);//轉成listList ageList = list.stream().map(Student::getAge).collect(Collectors.toList());//轉成setSet ageSet = list.stream().map(Student::getAge).collect(Collectors.toSet());//字串分隔符連線(aa,bb,cc)String stringJoin = list.stream().map(Student::getName).collect(Collectors.joining(",", "(", ")"));//-------------聚合操作----------------// 1.計算數量Long count = list.stream().filter(x->x.getAge()>3).count();// 2.最大值Integer maxAge = list.stream().map(Student::getAge).max(Integer::compare).orElse(0);// 3.求和Integer sumAge = list.stream().mapToInt(Student::getAge).sum();//BigDecimal需要做一次轉化BigDecimal sumMoney = list.stream() .map(Student::getMoney) .reduce( BigDecimal.ZERO, BigDecimal::add );//平均值Double averageAge = list.stream().collect(Collectors.averagingDouble(Student::getAge));BigDecimal averMoney = list.stream().map(Student::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(list.size()), 2, BigDecimal.ROUND_HALF_UP);//分組MapList//多重分組,先根據型別分再根據年齡分MapList//分割槽//分成兩部分,一部分大於10歲,一部分小於等於10歲MapList//reduce 歸併BigDecimal t = list.stream() .map(Student::getMoney) .reduce( BigDecimal.ZERO, (x,y)->{ return x.add(BigDecimal.ONE).multiply(y); });
版權宣告:本文為CSDN博主「適應地球生活」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_40749230/article/details/107257052