真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java的Stream流使用指南-創(chuàng)新互聯(lián)

準(zhǔn)備數(shù)據(jù):

10年積累的成都做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有興隆臺(tái)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
ListuserList = new ArrayList<>(16);
User user = new User();
user.setUserId(IdWorker.getId()).setUsername("歐陽(yáng)正才").setRole("1admin").setAge(18).setMoney(new BigDecimal("9915.80")).setAddress("山東濟(jì)南");
User user1 = new User();
user1.setUserId(IdWorker.getId()).setUsername("劉露").setRole("super-admin").setAge(19).setMoney(new BigDecimal("1580")).setAddress("山東濟(jì)南");
User user2 = new User();
user2.setUserId(IdWorker.getId()).setUsername("李彥宏").setRole("1admin").setAge(35).setMoney(new BigDecimal("560")).setAddress("山東濟(jì)南");
User user3 = new User();
user3.setUserId(null).setUsername("崔福來(lái)").setRole("user").setAge(21).setMoney(new BigDecimal("0.0")).setAddress("山東濟(jì)南");
User user4 = new User();
user4.setUserId(IdWorker.getId()).setUsername("歐陽(yáng)正才").setRole("admin").setAge(28).setMoney(new BigDecimal("9915.80")).setAddress("山東濟(jì)南");
userList.add(user);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);

數(shù)據(jù)如下:
[
 {"address":"山東濟(jì)南","age":18,"money":9915.80,"role":"1admin","userId":1507225552322748417,"username":"歐陽(yáng)正才"},
 {"address":"山東濟(jì)南","age":19,"money":1580,"role":"super-admin","userId":1507225552322748418,"username":"劉露"},
 {"address":"山東濟(jì)南","age":35,"money":560,"role":"1admin","userId":1507225552322748419,"username":"李彥宏"},
 {"address":"山東濟(jì)南","age":21,"money":0.0,"role":"user","username":"崔福來(lái)"},
 {"address":"山東濟(jì)南","age":28,"money":9915.80,"role":"admin","userId":1507225552322748420,"username":"歐陽(yáng)正才"}
]
filter

使用 filter() 過(guò)濾列表數(shù)據(jù)

// 獲取年齡大于20的用戶列表
Listusers = userList.stream().filter(i ->i.getAge() >20).collect(Collectors.toList());
log.info(JSONObject.toJSONString(users));

結(jié)果:
[{"address":"山東濟(jì)南","age":35,"money":560,"role":"1admin","userId":1507224853342052355,"username":"李彥宏"},
{"address":"山東濟(jì)南","age":21,"money":0.0,"role":"user","username":"崔福來(lái)"},
{"address":"山東濟(jì)南","age":28,"money":9915.80,"role":"admin","userId":1507224853342052356,"username":"歐陽(yáng)正才"}]
findAny、findFirst

注意:findFirst() 和 findAny() 都是獲取列表中的第一條數(shù)據(jù),但是findAny()操作,返回的元素是不確定的,對(duì)于同一個(gè)列表多次調(diào)用findAny()有可能會(huì)返回不同的值。使用findAny()是為了更高效的性能。如果是數(shù)據(jù)較少,串行地情況下,一般會(huì)返回第一個(gè)結(jié)果,如果是并行(parallelStream并行流)的情況,那就不能確保是第一個(gè)。

// 獲取權(quán)限是admin而且用戶名帶‘李’的用戶,任何一個(gè),沒(méi)有則返回null
User user = userList.stream().filter(i ->"admin".equals(i.getRole()) && isNotBlank(i.getUsername()) && i.getUsername().contains("李")).findAny().orElse(null);
anyMatch、allMatch、noneMatch

anyMatch判斷數(shù)據(jù)列表中是否存在任意一個(gè)元素符合設(shè)置的predicate條件,如果是就返回true,否則返回false。allMatch判斷數(shù)據(jù)列表中全部元素都符合設(shè)置的predicate條件,如果是就返回true,否則返回false,流為空時(shí)總是返回true。noneMatch判斷數(shù)據(jù)列表中全部元素都不符合設(shè)置的predicate條件,如果是就返回true,否則返回false,流為空時(shí)總是返回true。

// 是否有工資 >10000的數(shù)據(jù),有1個(gè)就是true
boolean money = userList.stream().anyMatch(i ->(null != i.getMoney() ? i.getMoney() : BigDecimal.ZERO).compareTo(new BigDecimal("10000")) >0);
// 是否全部員工工資 >= 100
boolean money1 = userList.stream().allMatch(i ->(null != i.getMoney() ? i.getMoney() : BigDecimal.ZERO).compareTo(new BigDecimal("100")) >= 0);
// 是否工資都不大于10000
boolean money2 = userList.stream().noneMatch(i ->(null != i.getMoney() ? i.getMoney() : BigDecimal.ZERO).compareTo(new BigDecimal("10000")) >0);
reduce((T, T) - T) 和 reduce(T, (T, T) - T)

用于組合流中的元素,如求和,求積,求大值等

// 用戶列表中年齡的大值、最小值、總和
int maxAge = userList.stream().map(User::getAge).reduce(Integer::max).get(); // 35
int minAge = userList.stream().map(User::getAge).reduce(Integer::min).get(); // 18
int allAge = userList.stream().map(User::getAge).reduce(0, Integer::sum); // 121

計(jì)算元素總和的方法其中暗含了裝箱成本,map(User::getAge) 方法過(guò)后流變成了 Stream類型,而每個(gè) Integer 都要拆箱成一個(gè)原始類型再進(jìn)行 sum 方法求和,這樣大大影響了效率。針對(duì)這個(gè)問(wèn)題 Java 8 有良心地引入了數(shù)值流 IntStream, DoubleStream, LongStream,這種流中的元素都是原始數(shù)據(jù)類型,分別是 int,double,long。

// 使用mapToInt() 求用戶列表中年齡的大值、最小值、總和、平均值。
int maxVal = userList.stream().mapToInt(User::getAge).max().getAsInt(); // 35
int minVal = userList.stream().mapToInt(User::getAge).min().getAsInt(); // 18
int sumVal = userList.stream().mapToInt(User::getAge).sum(); // 121
double aveVal = userList.stream().mapToInt(User::getAge).average().getAsDouble(); // 24.2
// 統(tǒng)計(jì)角色是admin的人數(shù),使用 counting()方法進(jìn)行統(tǒng)計(jì)
long userCount = userList.stream().filter(i ->"admin".equals(i.getRole())).collect(Collectors.counting());
// 統(tǒng)計(jì)角色是admin的人數(shù),使用 counting()方法進(jìn)行統(tǒng)計(jì)(推薦)
long userCount1 = userList.stream().filter(i ->"admin".equals(i.getRole())).count();

summingInt()、summingLong()、summingDouble():用于計(jì)算總和,需要一個(gè)函數(shù)參數(shù)。

// 計(jì)算年齡總和
int sumAge = userList.stream().collect(Collectors.summingInt(User::getAge)); // 121

averagingInt()、averagingLong()、averagingDouble():用于計(jì)算平均值。

// 計(jì)算平均年齡
double aveAge = userList.stream().collect(Collectors.averagingDouble(User::getAge));

summarizingInt()、summarizingLong()、summarizingDouble()

這三個(gè)方法比較特殊,比如 summarizingInt 會(huì)返回 IntSummaryStatistics 類型。IntSummaryStatistics類提供了用于計(jì)算的平均值、總數(shù)、大值、最小值、總和等方法。

// 獲取IntSummaryStatistics對(duì)象
IntSummaryStatistics ageStatistics = userList.stream().collect(Collectors.summarizingInt(User::getAge));

// 統(tǒng)計(jì):大值、最小值、總和、平均值、總數(shù)
System.out.println("大年齡:" + ageStatistics.getMax()); // 35
System.out.println("最小年齡:" + ageStatistics.getMin()); // 18
System.out.println("年齡總和:" + ageStatistics.getSum()); // 121
System.out.println("平均年齡:" + ageStatistics.getAverage()); // 24.2
System.out.println("員工總數(shù):" + ageStatistics.getCount()); // 5
針對(duì)BigDecimal類型
// 最高薪資
BigDecimal maxMoney = userList.stream().map(User::getMoney).max(BigDecimal::compareTo).get();
// 最低薪資
BigDecimal minMoney = userList.stream().map(User::getMoney).min(BigDecimal::compareTo).get();
// 薪資總和
BigDecimal sumMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
//平均薪資
BigDecimal avgMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(userList.size()), 2, BigDecimal.ROUND_HALF_UP);
System.out.println("最高薪資:" + maxMoney + "元"); // 9915.80元
System.out.println("最低薪資:" + minMoney + "元"); // 0.0元
System.out.println("薪資總和:" + sumMoney + "元"); // 21971.60元
System.out.println("平均薪資:" + avgMoney + "元"); // 4394.32元
sorted() / sorted((T, T) - int)

排序方法。如果流中的元素的類實(shí)現(xiàn)了 Comparable 接口,即有自己的排序規(guī)則,那么可以直接調(diào)用 sorted() 方法對(duì)元素進(jìn)行排序,如 Stream。反之, 需要調(diào)用sorted((T, T) - int)實(shí)現(xiàn) Comparator 接口。

// 根據(jù)年齡排序(升序)
userList = userList.stream().sorted(Comparator.comparingInt(User::getAge)).collect(Collectors.toList());
// 根據(jù)年齡排序(降序)
userList = userList.stream().sorted(Comparator.comparingInt(User::getAge).reversed()).collect(Collectors.toList());
groupingBy

可以接受一個(gè)第二參數(shù)實(shí)現(xiàn)多級(jí)分組

// 獲取大于18歲的,并根據(jù)角色role分組Map,key=role
Map>userGroupbyRoleMap = userList.stream().filter(i ->i.getAge() >18).collect(Collectors.groupingBy(User::getRole));

// 根據(jù)角色和金額對(duì)用戶列表進(jìn)行分組
Map>>userMap = userList.stream()
        .collect(Collectors.groupingBy(User::getRole, Collectors.groupingBy(User::getMoney)));
        
// 根據(jù)角色和金額對(duì)用戶列表進(jìn)行分組(map的key,如果userId有null則替換為-1)
Map>>userMap1 = userList.stream()
        .collect(Collectors.groupingBy(User::getRole, Collectors.groupingBy(i ->i.getUserId() == null ? -1 : i.getUserId())));
// 根據(jù)角色進(jìn)行分組,匯總各個(gè)角色用戶的平均年齡
MapuserRoleMap = userList.stream().collect(Collectors.groupingBy(User::getRole, Collectors.averagingInt(User::getAge)));
System.out.println(JSONObject.toJSONString(userRoleMap));

{"super-admin":19.0,"admin":27.0,"user":21.0}

// 將導(dǎo)入的數(shù)據(jù)根據(jù)臺(tái)賬號(hào)分組,如果accountNo是null,則先將accountNo替換為空串""
Map>accountGeneralEntityMap = accountGeneralEntityList.stream()
                    .collect(Collectors.groupingBy(i ->isBlank(i.getAccountNo()) ? "" : i.getAccountNo()));
joining拼接
// 查詢年齡大于19的用戶名,去重后用,拼接。
String usernames = userList.stream().filter(i ->i.getAge() >19).map(User::getUsername).distinct().collect(Collectors.joining(","));
// 將ID轉(zhuǎn)為String并用逗號(hào)拼接起來(lái)。
String decIds = decHeads.stream().map(i ->i.getId().toString()).collect(Collectors.joining(","));
組合用法示例
// 獲取用戶名集合,用戶ID不為空且去重
Listusers = userList.stream().filter(i ->i.getUserId() != null).map(User::getUsername).distinct().collect(Collectors.toList());

// 獲取用戶名數(shù)組,用戶ID不為空且去重
String[] usersArr = userList.stream().filter(i ->i.getUserId() != null).map(User::getUsername).distinct().collect(Collectors.toList()).toArray(new String[userList.size()]);

// 統(tǒng)計(jì)總歲數(shù),排除用戶ID是空的
int totalAge = userList.stream().filter(i ->isNotEmpty(i.getUserId())).mapToInt(User::getAge).sum();

// 統(tǒng)計(jì)工資的數(shù)量,可設(shè)置去重
long moneyCount = userList.stream().filter(i ->isNotEmpty(i.getUserId())).map(User::getMoney).count();
long moneyCount1 = userList.stream().filter(i ->isNotEmpty(i.getUserId())).map(User::getMoney).distinct().count();

// 獲取用戶列表,要求跳過(guò)第1條數(shù)據(jù)后的前3條數(shù)據(jù)
Listusers1 = userList.stream().skip(1).limit(3).collect(Collectors.toList());

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


本文名稱:Java的Stream流使用指南-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://weahome.cn/article/ecppj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部