自己封装的一些算数工具方法
工作中计算的比较多,自己封装了一些工具方法,感觉还是挺好用的。
package com.yunmeng.iot.common.utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* 计算常用工具类
*
* @author Linzj
* @date 2023/3/18/018 16:22
*/
public class MathUtil {
/**
* 判断参数是否为0
*
* @param num 参数
* @return 0返回true,反之返回false
*/
private static boolean isZero(BigDecimal num) {
return num.compareTo(BigDecimal.ZERO) == 0;
}
/**
* 除法工具方法
* 有时候用 BigDecimal 除法,被除数是0会/by zero,或者除数是0除了也是0
*
* @param divisor 除数
* @param dividend 被除数
* @return 结果,四舍五入两位小数
*/
public static BigDecimal divide(BigDecimal divisor, BigDecimal dividend) {
if (Objects.isNull(divisor) || Objects.isNull(dividend)) {
return BigDecimal.ZERO;
}
if (isZero(dividend) || isZero(divisor)) {
return BigDecimal.ZERO;
}
return divisor.divide(dividend, 2, RoundingMode.HALF_UP);
}
/**
* 除法工具方法
* 有时候用 BigDecimal 除法,被除数是0会/by zero,或者除数是0除了也是0
*
* @param divisor 除数
* @param dividend 被除数
* @return 结果,四舍五入两位小数
*/
public static BigDecimal divide(BigDecimal divisor, BigDecimal dividend, int scale, RoundingMode roundingMode) {
if (Objects.isNull(divisor) || Objects.isNull(dividend)) {
return BigDecimal.ZERO;
}
if (isZero(dividend) || isZero(divisor)) {
return BigDecimal.ZERO;
}
return divisor.divide(dividend, scale, roundingMode);
}
/**
* 计算百分比 (保留两位小数)
*
* @param divisor 除数
* @param dividend 被除数
* @return 百分比
*/
public static String percentage(BigDecimal divisor, BigDecimal dividend) {
if (isZero(dividend) || isZero(divisor)) {
return "0%";
}
// 计算百分比
return divisor.divide(dividend, 4, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100))
.setScale(2, RoundingMode.HALF_UP)
.toPlainString() + "%";
}
/**
* 统计数量
*/
public static <T> Long count(Predicate<? super T> predicate, List<T> list) {
return list.stream()
.filter(predicate)
.count();
}
/**
* BigDecimal类型求和
*/
public static <T> BigDecimal sumBigDecimal(Function<? super T, BigDecimal> function, List<T> list) {
return list.stream()
.map(function)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
/**
* Long类型求和
*/
public static <T> Long sumLong(Function<? super T, Long> function, List<T> list) {
return list.stream()
.map(function)
.filter(Objects::nonNull)
.reduce(0L, Long::sum);
}
}