StreamAPI 處理 BigDecimal 的 add 操作
來源 |?公眾號「鍋外的大佬」
1. 引言
我們通常使用Java ?Stream API ?來處理數(shù)據(jù)集合。
一個不錯的特性是支持對數(shù)字流的操作,比如sum操作。但是,我們不能以這種方式處理所有數(shù)值類型
在本文中,我們將了解如何對諸如BigDecimal之類的數(shù)字流執(zhí)行sum操作。
2. 如何用流求和
Stream API 提供數(shù)字流 numbers Stream,包括?IntStream、DoubleStream、和LongStream我們通過創(chuàng)建一個數(shù)字流來來搞清楚它們是如何工作的。然后,我們用?[IntStream#sum]?計算它的總數(shù):
IntStream intNumbers = IntStream.range(0, 3);assertEquals(3, intNumbers.sum());
我們可以從Doubles的列表開始執(zhí)行類似的操作。通過使用streams,我們可以使用?mapToDouble?將對象流轉(zhuǎn)換為Double stream:
ListdoubleNumbers = Arrays.asList(23.48, 52.26, 13.5); double result = doubleNumbers.stream().mapToDouble(Double::doubleValue).sum();assertEquals(89.24, result, .1);
所以,如果我們能用同樣的方法總結(jié)出一組?BigDecimal?數(shù)字,那就很有用了。
**不幸的是,沒有BigDecimalStream。**所以,我們需要另一個解決方案。
3. 使用Reduce添加BigDecimal數(shù)字
我們使用 *Stream.reduce*來計算sum:
StreamintNumbers = Stream.of(5, 1, 100); int result = intNumbers.reduce(0, Integer::sum);assertEquals(106, result);
這適用于任何可以邏輯相加的數(shù)據(jù),包括BigDecimal:
StreambigDecimalNumber = ??Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);BigDecimal result = bigDecimalNumber.reduce(BigDecimal.ZERO, BigDecimal::add);assertEquals(11, result);
reduce方法有兩個參數(shù):
- Identity?– 等于0–它是還原的起始值
- Accumulator function?– 接受兩個參數(shù),目前為止的結(jié)果,以及流的下一個元素
4. Conclusion
本文中,我們研究了如何在數(shù)字流中計算數(shù)字之和。以及如何使用reduce作為替代。
【墻裂推薦】
專注于「開發(fā)者」綜合成長的深度星球限時優(yōu)惠進(jìn)行中最近熱門內(nèi)容回顧? ?#技術(shù)人系列

下方二維碼關(guān)注我

互聯(lián)網(wǎng)草根,堅持分享技術(shù)、創(chuàng)業(yè)、產(chǎn)品等心得和總結(jié)~

點擊“閱讀原文”,領(lǐng)取 2020 年最新免費技術(shù)資料大全
↓↓↓?