需求 : 比如统计 性别为"女性"的化妆品消费支出 和 职业为"Java程序员"的植发消费支出......等数据信息;
分析:
1.我们都是要累计求和
2.统计的项目不同,有化妆品消费的,也有其他消费的数据
3.条件不同,有性别筛选,也有岗位筛选
实现: 使用函数式编程, 传入统计的项目和条件作为参数, 然后在计算函数里面进行计算 ;
代码部分 : 以int类型和BigDecimal类型作为例子统计
package function; import lombok.Data; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.ToIntFunction; public class PersonServiceNew { @Data public static class Person { private String name; private String gender; private int age; private int money; private BigDecimal moneyBD; } //模拟的数据 private static List<Person> list = new ArrayList<>(); //数据初始化赋值 static { Person p1 = new Person(); p1.setName("hello1"); p1.setAge(10); p1.setGender("女"); p1.setMoney(1000); p1.setMoneyBD(new BigDecimal("1000")); Person p2 = new Person(); p2.setName("hello2"); p2.setAge(20); p2.setGender("男"); p2.setMoney(2000); p2.setMoneyBD(new BigDecimal("2000")); Person p3 = new Person(); p3.setName("hello3"); p3.setAge(30); p3.setGender("女"); p3.setMoney(3000); p3.setMoneyBD(new BigDecimal("3000")); Person p4 = new Person(); p4.setName("hello4"); p4.setAge(40); p4.setGender("男"); p4.setMoney(4000); p4.setMoneyBD(new BigDecimal("4000")); list.add(p1); list.add(p2); list.add(p3); list.add(p4); } /** * count based on incoming methods and conditions * * @param method * @param predicate * @return value is of type int */ public static int count(ToIntFunction<Person> method, Predicate<Person> predicate) { int sum = list.stream() .filter(predicate::test) .mapToInt(method).sum(); return sum; } /** * count based on incoming methods and conditions * * @param method * @param predicate * @return value is of type BigDecimal */ public static BigDecimal countBg(Function<Person, BigDecimal> method, Predicate<Person> predicate) { BigDecimal sum = list.stream() .filter(predicate::test) .map(method).reduce(BigDecimal.ZERO, BigDecimal::add); return sum; } public static void main(String[] args) { //统计 年龄=10 的所有年龄之和 结果: sum1 :10 int sum1 = count(Person::getAge, p -> 10 == p.getAge()); System.out.println("sum1 :" + sum1); //统计 所有性别 "女" 的 money 结果: sum2 :4000 int sum2 = count(Person::getMoney, p -> "女".equals(p.getGender())); System.out.println("sum2 :" + sum2); //统计 年龄=10 的所有money之和 , 结果: sum11 :1000 BigDecimal sum11 = countBg(Person::getMoneyBD, p -> p.getAge() == 10); System.out.println("sum11 :" + sum11); //统计 所有性别 "女" 的 moneyBD 结果: sum22 :4000 BigDecimal sum22 = countBg(Person::getMoneyBD, p -> "女".equals(p.getGender())); System.out.println("sum22 :" + sum22); } }