想喝喝奶茶,下了一单,啵啵跟烧仙草一起,葡萄干跟椰果一起!
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class WaimaiJiqian {
public static void main(String[] args) {
List moneys = new ArrayList<>();
moneys.add(new MemberOfMoney("小广", new BigDecimal("15")));
moneys.add(new MemberOfMoney("小溪", new BigDecimal("13")));
moneys.add(new MemberOfMoney("小谁", new BigDecimal("17")));
moneys.add(new MemberOfMoney("小轩", new BigDecimal("14")));
BigDecimal allPay = new BigDecimal("32");
BigDecimal premium = new BigDecimal("3.5"); // 额外费用,例如:配送费
BigDecimal preferential = new BigDecimal("27"); // 除去优惠额外费用,例如:配送费
BigDecimal preferentialTotalPrice = preferential.add(premium); // 总优惠
// 计算比例
BigDecimal reduce = moneys.stream().map(money -> {
return money.getMoneyInfos()[0];
}).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalPrice = reduce.add(premium); // 总价 计算完比例,加入额外费用,例如:配送费
List proportions = moneys.stream().map(money -> {
money.getMoneyInfos()[1] = money.getMoneyInfos()[0].divide(reduce, 2, BigDecimal.ROUND_HALF_DOWN);
return money;
}).collect(Collectors.toList());
// 计算优惠
List preferentials = proportions.stream().map(proportion -> {
proportion.getMoneyInfos()[2] = preferential.multiply(proportion.getMoneyInfos()[1]);
proportion.getMoneyInfos()[3] = preferentialTotalPrice.multiply(proportion.getMoneyInfos()[1]);
return proportion;
}).collect(Collectors.toList());
// 计算应付
List copes = preferentials.stream().map(proportion -> {
proportion.getMoneyInfos()[4] = allPay.multiply(proportion.getMoneyInfos()[1]);
for (int i = 0; i < proportion.getMoneyInfos().length; i++) {
proportion.getMoneyInfos()[0] = proportion.getMoneyInfos()[0].setScale(2, BigDecimal.ROUND_HALF_UP);
proportion.getMoneyInfos()[1] = proportion.getMoneyInfos()[1].setScale(2, BigDecimal.ROUND_HALF_UP);
proportion.getMoneyInfos()[2] = proportion.getMoneyInfos()[2].setScale(2, BigDecimal.ROUND_HALF_UP);
proportion.getMoneyInfos()[3] = proportion.getMoneyInfos()[3].setScale(2, BigDecimal.ROUND_HALF_UP);
proportion.getMoneyInfos()[4] = proportion.getMoneyInfos()[4].setScale(2, BigDecimal.ROUND_HALF_UP);
}
return proportion;
}).collect(Collectors.toList());
BigDecimal verify = copes.stream().map(cope -> cope.getMoneyInfos()[4]).reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.printf("%-5s %-5s %-5s %-5s %-5s %-5s(总价:%s,实付价格:%s,优惠价格:%s,人数:%s)%n", "是谁呢", "原价", "占比", "优惠价", "总优惠", "应付价",
reduce.toString(), allPay.toString(), preferential.toString(), moneys.size());
copes.forEach(cope -> {
System.out.printf("%-5s %-5s %-5s %-5s %-5s %-5s%n",
cope.getName(),
cope.getMoneyInfos()[0].toString(),
cope.getMoneyInfos()[1].toString(),
cope.getMoneyInfos()[2].toString(),
cope.getMoneyInfos()[3].toString(),
cope.getMoneyInfos()[4].toString());
});
System.out.printf("核实:%s%n", verify.toString());
}
}
@Data
class MemberOfMoney {
String name;
BigDecimal[] moneyInfos = new BigDecimal[5];
MemberOfMoney() {
}
MemberOfMoney(String name, BigDecimal[] moneyInfos) {
this.name = name;
int i = 0;
for (BigDecimal moneyInfo : moneyInfos) {
this.moneyInfos[i] = moneyInfo;
i++;
}
}
MemberOfMoney(String name, BigDecimal moneyInfo) {
this.name = name;
this.moneyInfos[0] = moneyInfo;
}
}