一、示例數據
1、類結構
字段名稱 | 字段類型 | 字段備註 |
id | Integer | 唯一標識 |
score | Double | 分數 |
money | BigDecimal | 獎金 |
2、列表初始化數據
id | score | money |
1 | 96.0 | 5000 |
2 | 84.5 | 4000 |
3 | 70.0 | 3000 |
4 | 74.0 | 3000 |
5 | 82.0 | 4000 |
二、流操作
1、求和
int、double、long類型求和(哪種類型的就將mapTo方法更換爲對應的類型,括號裏爲類裏要求和的數據列,後綴是sum方法):
Double d = list.stream().mapToDouble(TestClass :: getScore).sum();
BigDecimal類型求和:
BigDecimal b = list.stream().map(TestClass::getMoney).reduce(BigDecimal.ZERO,BigDecimal::add);
2、篩選
篩選單個:
TestClass testClassFindOne = list.stream().filter(testClass -> testClass.score == 70.0).findAny().orElse(null);
篩選多個:
List<TestClass> testClassFindManyList = list.stream().filter(testClass -> testClass.score > 80.0).collect(Collectors.toList());
篩選的時候都是使用filter方法,區別在於條件不同,單個屬性通過不同的判斷條件來判斷是否符合篩選條件。
查單個時是使用精準匹配的條件,且使用findAny()在列表中提取出符合條件的元素,附加條件orElse(null)表示的是如果沒有查到符合條件的元素時,則返回空。
查多個時往往是使用範圍性的條件,如大於小於或者存在重複數據時進行匹配,查詢完之後通過collect(Collectors.toList())進行組合,返回的是一個包含符合條件元素的列表,無符合條件的元素時爲空列表。
3、遍歷
list.stream().forEach(testClass -> { xxxxxx(); });
遍歷使用foreach方法,對列表中的每個元素執行操作。
4、統計
Long count = list.stream().filter(testClass -> testClass.score > 80).count();
統計使用count()方法進行計數並返回。
5、分組
Map<Integer,List<TestClass>> testClassGroupList = list.stream().collect(Collectors.groupingBy(TestClass :: getId));
分組通過Collectors.groupingBy進行,參數爲實體類裏的數據列,數據類型爲int。
注:該方法進行分組時返回的Map類型默認爲HashMap,是沒有順序的。如果需要順序進行分組,可以添加設置LinkedHashMap。
Map<Integer,List<TestClass>> testClassGroupList2 = list.stream().collect(Collectors.groupingBy(TestClass :: getId, LinkedHashMap::new,Collectors.toList()));