最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Stream聚合函數(shù)如何對BigDecimal求和

 更新時間:2023年05月29日 16:35:10   作者:SUDDEV  
這篇文章主要介紹了利用Stream聚合函數(shù)如何對BigDecimal求和問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

利用Stream聚合函數(shù)對BigDecimal求和

數(shù)據(jù)庫查找的結(jié)果經(jīng)常會有List等集合,而集合中存放法是JAVA對象,對象中存在BigDecimal的字段,如果用for或者iterator遍歷來累加感覺很麻煩,stream聚合函數(shù)很好的解決了這個問題.做個筆記mark一下

POJO

package test;
import java.math.BigDecimal;
/**
?* 用戶實體類
?*
?* @author suddev
?* @create 2018-02-26 上午11:03
?**/
public class User {
? ? private long id;
? ? private BigDecimal money;
? ? public User(long id, BigDecimal money) {
? ? ? ? this.id = id;
? ? ? ? this.money = money;
? ? }
? ? // getter&setter
}

在實體類中,我們可以看到實體存在一個為BigDecimal的money屬性,以計算所有查詢出來的用戶金錢總額為例子:

package test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
?* 測試類
?*
?* @author suddev
?* @create 2018-02-26 上午11:03
?**/
public class Test {
? ? public static void main(String[] args) {
? ? ? ? // 準(zhǔn)備數(shù)據(jù)
? ? ? ? List<User> userList = new ArrayList<User>();
? ? ? ? for (int i = 0; i < 100; i++) {
? ? ? ? ? ? User user = new User(i,new BigDecimal(i+"."+i));
? ? ? ? ? ? userList.add(user);
? ? ? ? }
? ? ? ? // for version
? ? ? ? BigDecimal result1 = BigDecimal.ZERO;
? ? ? ? for (User user : userList) {
? ? ? ? ? ? result1 = result1.add(user.getMoney());
? ? ? ? }
? ? ? ? System.out.println("result1 = "+result1);
? ? ? ? // java 8 stream version
? ? ? ? BigDecimal result2 = userList.stream()
? ? ? ? ? ? ? ? // 將user對象的mongey取出來map為Bigdecimal
? ? ? ? ? ? ? ? .map(User::getMoney)
? ? ? ? ? ? ? ? // 使用reduce聚合函數(shù),實現(xiàn)累加器
? ? ? ? ? ? ? ? .reduce(BigDecimal.ZERO,BigDecimal::add);
? ? ? ? System.out.println("result2 = "+result2);
? ? }
}
  • map是一個對于流對象的中間操作,通過給定的方法,它能夠把流對象中的每一個元素對應(yīng)到另外一個對象上,這里將user對象的money取出來map為Bigdecimal
  • reduce是一個終結(jié)操作,它能夠通過某一個方法,對元素進(jìn)行削減操作。該操作的結(jié)果會放在一個Optional變量里返回??梢岳盟鼇韺崿F(xiàn)很多聚合方法比如count,max,min等。

這里利用了reduce的第二個方法重載

Treduce(T identity, BinaryOperator accumulator);

第一個參數(shù)是我們給出的初值,第二個參數(shù)是累加器,可以自己用實現(xiàn)接口完成想要的操作,這里使用Bigdecimal的add方法

最后reduce會返回計算后的結(jié)果

Stream流,求和計算

Stream 是對集合(Collection)對象功能的增強(qiáng),它專注于對集合對象進(jìn)行各種非常便利、高效的聚合操作,或者大批量數(shù)據(jù)操作。通常我們需要多行代碼才能完成的操作,借助于Stream流式處理可以很簡單的實現(xiàn)。 

將分別使用傳統(tǒng)的foreach 和 stream流 進(jìn)行集合的求和匯總運算,廢話不多說,直接上代碼 

創(chuàng)建測試的實體類

@Data
@ToString
public class Sys_testClass implements Serializable {
? ? private String name;//名稱
? ? private double price;//價格
? ? private int number;//數(shù)量
? ? private double sum_price;//商品總價格
}

插個題外話,上面的 @Date和@ToString 注解代替了我們自動生成的getting,setting和toString方法,讓類看上去更簡潔明了,并且當(dāng)你重新添加或刪除字段的時候,不用去管getting,setting方法,大大節(jié)省了開發(fā)時間及效率,如果想用的小伙伴,直接導(dǎo)入 lombok依賴即可

創(chuàng)建 Main方法

并且往集合中添加測試數(shù)據(jù)

public static void main(String[] args) {
? ? List<Sys_testClass> listTest = new ArrayList<>();
? ? Sys_testClass test1 = new Sys_testClass();
? ? test1.setName("商品1");
? ? test1.setPrice(3200.0);
? ? test1.setNumber(3);
? ? test1.setSum_price(test1.getPrice()*test1.getNumber());
? ? listTest.add(test1);
? ? Sys_testClass test2 = new Sys_testClass();
? ? test2.setName("商品2");
? ? test2.setPrice(1599.0);
? ? test2.setNumber(6);
? ? test2.setSum_price(test2.getPrice()*test2.getNumber());
? ? listTest.add(test2);
? ? Sys_testClass test3 = new Sys_testClass();
? ? test3.setName("商品3");
? ? test3.setPrice(999.0);
? ? test3.setNumber(2);
? ? test3.setSum_price(test3.getPrice()*test3.getNumber());
? ? listTest.add(test3);
}

 利用傳統(tǒng)foreach循環(huán)遍歷

得到集合中所有價格的和,代碼如下

double sum_price=0.00; //價格總和的初始值
for (Sys_testClass sys_testClass : listTest) {
? ? sum_price+=sys_testClass.getSum_price();//循環(huán)相加 集合中的總價格
}
System.err.println(sum_price);// 打印輸出值為: 21192.0

利用java8新特性(Stream流)遍及集合

只需要一行代碼

double sum_price = listTest.stream().mapToDouble(Sys_testClass::getSum_price).sum();
System.err.println(sum_price);//打印輸出值為: 21192.0

注:價格是double 類型,所以這里用了mapToDouble方法,如果是int類型求和 替換成 mapToInt方法即可

兩者相比可以看出傳統(tǒng)循環(huán)需要 4 行代碼,而新特性只需要 1 行代碼,速度上其實一樣的,底層都是循環(huán)遍歷得到結(jié)果,但是集合多了,開發(fā)時間就將會大大節(jié)省 

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

嵊泗县| 砀山县| 吉安县| 兰溪市| 油尖旺区| 沙田区| 津市市| 攀枝花市| 阿坝| 丹凤县| 海阳市| 丹阳市| 屯留县| 达日县| 丰镇市| 雅安市| 蒲城县| 治多县| 邢台县| 肇庆市| 玉树县| 三都| 宁武县| 梁平县| 青神县| 江门市| 小金县| 万载县| 灵寿县| 河北区| 德兴市| 轮台县| 南溪县| 临颍县| 安康市| 华宁县| 南平市| 兰坪| 开远市| 新安县| 河西区|