1. 程式人生 > 其它 >java8 list根據物件屬性去重_Java8 流操作

java8 list根據物件屬性去重_Java8 流操作

技術標籤:java8 list根據物件屬性去重

Java8 流操作整理

分類

Stream操作分類

2f1f1e47f6fa95813b6823398c2795df.png

無狀態:指元素的處理不受之前元素的影響;

有狀態:指該操作只有拿到所有元素之後才能繼續下去。

非短路操作:指必須處理所有元素才能得到最終結果;

短路操作:指遇到某些符合條件的元素就可以得到最終結果,如 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