List使用Stream流進行集合Collection的各種運算彙總:對BigDecimal求和,某個欄位的和、最大值、最小值、平均值,欄位去重,過濾等
阿新 • • 發佈:2021-01-20
寫Java介面的朋友都知道,Java 8的更新,經常會用到過濾 list<Object> 裡的資料,本文就對List使用Stream流進行集合Collection的各種運算做一個彙總!
優勢:
Stream 是對集合(Collection)物件功能的增強,它專注於對集合物件進行各種非常便利、高效的聚合操作,或者大批量資料操作。
通常我們需要多行程式碼才能完成的操作,藉助於Stream流式處理可以很簡單的實現。
各種Stream流操作:
- 過濾soList中Object的Name欄位為空的情況
List<Object> soList = Lists.newArrayList(); List<Object> list = soList.stream().filter(item -> item.getName() != null).collect(Collectors.toList());
- 取soList列表根據物件某個欄位 去重
List<Object> soList = Lists.newArrayList() //distinct() 去重 List<Integer> maxDueDayList2 = soList.stream().map(Object::getMaxDueDay).distinct().collect(Collectors.toList());
- 計算一個List物件中某個欄位總和
int total = list.stream().mapToInt(User::getAge).sum(); //上下等同 int ageSum = userList.stream().collect(Collectors.summingInt(User::getAge));
- 計算一個List物件中某個欄位的和、最大值、最小值、平均值、總個數
double doublesum = listUsers.stream().mapToDouble(Users::getAge).sum();//和 int intmax = listUsers.stream().mapToInt(Users::getAge).max().getAsInt();//最大 int intmin = listUsers.stream().mapToInt(Users::getAge).min().getAsInt();//最小 double avg = listUsers.stream().mapToDouble(Users::getAge).average().getAsDouble();//平均
//計算一個number型別的List物件 Integer[] integerArray = {1, 3, 5, 10, 18}; List<Integer> list = new ArrayList<>(Arrays.asList(integerArray)); IntSummaryStatistics summaryStatistics = list.stream().mapToInt((s) -> s).summaryStatistics(); System.out.println("總和:" + summaryStatistics.getSum()); System.out.println("平均數:" + summaryStatistics.getAverage()); System.out.println("總個數:" + summaryStatistics.getCount()); System.out.println("最大值:" + summaryStatistics.getMax()); System.out.println("最小值:" + summaryStatistics.getMin());
- Java集合物件中的一個欄位對其進行排序
Collections.sort(list, (o1, o2) -> o1.getCustomerCount() - o2.getCustomerCount()); List<Integer> ss = new ArrayList<>(); Collections.sort(ss, (o1, o2) -> (o1 - o2));
- 取出list物件中的一個屬性 列
List<String> stIdList1 = stuList.stream().map(Student::getId).collect(Collectors.toList());
- List使用Stream對BigDecimal求和方法
BigDecimal result = fileDatas.stream() // 將user物件的age取出來map為Bigdecimal .map(IpayRepayFileData::getTotalAmount) // 使用reduce()聚合函式,實現累加器 .reduce(BigDecimal.ZERO,BigDecimal::add);
reduce是一個終結操作,它能夠通過某一個方法,對元素進行削減操作。該操作的結果會放在一個Optional變數裡返回。可以利用它來實現很多聚合方法比如count,max,min等。
T reduce(T identity, BinaryOperator accumulator);
第一個引數是我們給出的初值,第二個引數是累加器,可以自己用實現介面完成想要的操作,這裡使用Bigdecimal的add方法 最後reduce會返回計算後的結果
大家如果還有其他list的操作歡迎評論補