• 函数式编程-统计功能(使用对象的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);
    
        }
    
    }
  • 相关阅读:
    静态库中的静态变量连接失败的解决
    (转)Virtual PC 2007虚拟网络设置
    (zt)iPhone Developer注册
    (zt)正则表达式30分钟入门教程
    (zt)Flex SDK 3.2和Flex Builder 3.0.2升级
    (转)完成端口之性能优化
    (摘)法拉利年代型号
    安装windows下的NDS开发环境
    [C#]小问题
    javascript "未结束字符串"
  • 原文地址:https://www.cnblogs.com/coloz/p/13099290.html
Copyright © 2020-2023  润新知