函数式编程-统计功能(使用对象的getter方法和过滤条件作为参数)

需求 :  比如统计 性别为"女性"的化妆品消费支出 和 职业为"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);

    }

}

 

posted @ 2020-06-12 14:40  将军上座  阅读(349)  评论(0编辑  收藏  举报