如何使用lamda表達(dá)式對list進(jìn)行求和
使用lamda表達(dá)式對list進(jìn)行求和
Lambda 表達(dá)式是 JDK8 的一個新特性,最近寫項目中求和計算使用的較多,寫篇文章記錄下。
1、實體類List返回Integer類型求和
//根據(jù)id查詢庫存 List<ProductStock> list = productStockMapper.selectList(Wrappers.<ProductStock>lambdaQuery().in(Product::id, idList)) //查詢所有庫存總和 Integer qtySum = list.stream().mapToInt(ProductStock::getStockQty).sum();
2、Integer類型List返回Integer類型求和
//查詢當(dāng)前所有商品庫存 List<Integer> stockList = productStockMapper.selectStock(); //查詢所有庫存總和 Integer stockSum = stockList .stream().mapToInt(Integer::intValue).sum();
3、實體類List返回Bigdecimal類型求和
//根據(jù)id查詢庫存 List<ProductStock> list = productStockMapper.selectList(Wrappers.<ProductStock>lambdaQuery().in(Product::id, idList)) //查詢所有庫存金額總和 BigDecimal stockAmt = list .stream().map(ProductStock::getStockAmt).reduce(BigDecimal::add).orElse(Bigdecimal.ZERO);
4、BigDecimal類List返回Bigdecimal類型求和
//查詢當(dāng)前所有商品庫存 List<Bigdecimal> stockList = productStockMapper.selectStock(); //查詢所有庫存金額總和 Bigdecimal stockAmt = stockList.stream().reduce(BigDecimal::add).orElse(Bigdecimal.ZERO);
**注:orElse(Bigdecimal.ZERO)而不是get(),是因為防止返回空(此處如果用get(),在idea中也會有警告)。
最近用到的就這些,后續(xù)用到別的還會再更新!
list與Lamda表達(dá)式配合的常用方法
1、刪除所有值為400的元素
list.RemoveAll(e=>e==400);
2、刪除所有能被100整除的元素
list.RemoveAll(e=>e%100==0);
3、求和
int sum=0; int result = list.ForEach(val=>sum+=val);
4、刪除所有值為400的元素
bool result = list.Exists(e=>e==400)
5、是否所有的元素都等于400
bool result = list.TrueForAll(e=>e==400)
6、返回能被100整除的元素(從前向后找)
var result = list.Find(e=>e%100==0);
6、返回能被100整除的元素(從后向前找)
var result = list.FindLast(e=>e%100==0);
7、返回能被100整除的List
var result = list.FindAll(e=>e%100==0);
8、返回能被100整除的索引(從前向后找)
int result = list.FindIndex(e=>e%100==0);
9、返回能被100整除的索引(從后向前找)
int result = list.FindLastIndex(e=>e%100==0);
10、二分查找(速度較快,它的原理是先把排序好的list分成2分,搜索中點值,發(fā)現(xiàn)值不對,就可以砍掉這個分組,只剩下一半再查找)
list.Sort();//二分查找前先必須先升序排序 int result = list.BinarySearch(e=>e%100==0);
11、對類(引用類型)進(jìn)行排序(bookList.Sort()),需要類實現(xiàn)IComparable接口
internal class Book : IComparable<Book> { ?? ?public int ID { get; set; } ?? ?public string Name { get; set; } ?? ?public double Price { get; set; } ?? ?public int CompareTo([AllowNull] Book other) ?? ?{ ?? ??? ?if (other == null) return 1; ?? ??? ?return this.ID - other.ID;//返回正數(shù),this>other;返回0,this=other;返回負(fù)數(shù),this<other; ?? ?} ?? ?public override string ToString() ?? ?{ ?? ??? ?return JsonSerializer.Serialize(this); ?? ?} ?? ?public override bool Equals(object obj) ?? ?{ ?? ??? ?if (obj == null) return false; ?? ??? ?Book other = obj as Book; ?? ??? ?if (other.ID == this.ID && other.Name == this.Name && other.Price == this.Price) return true; ?? ??? ?return false; ?? ?} }
12、對類(引用類型)進(jìn)行二分查找(bookList.BinarySearch()),只能查找相應(yīng)對象。如果只查找屬性一致的對象,需重寫Equals()方法,如上所示。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談java String.split丟失結(jié)尾空字符串的問題
下面小編就為大家?guī)硪黄獪\談java String.split丟失結(jié)尾空字符串的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Springboot整合SpringSecurity的完整案例詳解
Spring Security是基于Spring生態(tài)圈的,用于提供安全訪問控制解決方案的框架,Spring Security登錄認(rèn)證主要涉及兩個重要的接口 UserDetailService和UserDetails接口,本文對Springboot整合SpringSecurity過程給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-01-01Java swing實現(xiàn)酒店管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java swing實現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02SpringBoot利用@Validated注解優(yōu)雅實現(xiàn)參數(shù)校驗
在開發(fā) Web 應(yīng)用時,用戶輸入的合法性校驗是保障系統(tǒng)穩(wěn)定性的基礎(chǔ),?Spring Boot 的 @Validated 注解 提供了一種更優(yōu)雅的解決方案,下面就跟隨小編一起學(xué)習(xí)一下吧2025-04-04解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個文件無法傳輸多個問題
這篇文章主要介紹了解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個文件無法傳輸多個問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08在SpringBoot中更改默認(rèn)端口的方法總結(jié)
在本文中,小編將帶大家學(xué)習(xí)如何在 Spring Boot 中更改默認(rèn)端口,默認(rèn)情況下,嵌入式 Web 服務(wù)器使用 8080端口來啟動 Spring 引導(dǎo)應(yīng)用程序,有幾種方法可以更改該端口,文中介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07kafka生產(chǎn)者和消費者的javaAPI的示例代碼
這篇文章主要介紹了kafka生產(chǎn)者和消費者的javaAPI的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06