JDFrame数据处理

1、基本信息

源码

        JDFrame的核心优势之一是其丰富的API。它不仅包含了Java 8 Stream的基础操作,还增加了更多高级数据处理功能,如窗口函数、复杂条件过滤、自定义聚合,以及类似SQL的分组、聚合和连接操作。这些额外的功能使得JDFrame能够轻松应对复杂的数据操作需求,为开发者提供了更大的灵活性和便利性。

1.1、添加依赖

<dependency>
    <groupId>io.github.burukeyou</groupId>
    <artifactId>jdframe</artifactId>
    <version>0.1.3</version>
</dependency>

2、简单案列

2.1、分组求和

        统计一年级各班成绩总和,获取总分前两名的班级。

结果

2.2、语法使用

2.2.1、数据筛选

2.2.2、求和汇总

2.2.3、分组聚合

2.2.4、数据排序

        简化原生stream的排序方式,直接指定字段即可,不用使用Comparator还要去关注升序还是降序. 如果是多级排序使用Compartor或者Sorter去指定多级排序的逻辑。Sorter也是Compartor的一种实现,只是提供了更加语义化的多级排序指定逻辑, 相当于内置了Compartor的thenComparing

3、资料

public class Test01 {


    public static void main(String[] args) {

        List<User> userList = new ArrayList<>();
        userList.add(new User(1, "张一", 1, new BigDecimal(90), "一班"));
        userList.add(new User(1, "张二", 1, new BigDecimal(95), "一班"));
        userList.add(new User(1, "张三", 1, new BigDecimal(80), "二班"));
        userList.add(new User(1, "张四", 1, new BigDecimal(100), "二班"));
        userList.add(new User(1, "张六", 1, new BigDecimal(90), "三班"));
        userList.add(new User(1, "张七", 1, new BigDecimal(85), "三班"));
        userList.add(new User(1, "张八", 2, new BigDecimal(85), "三班"));
        userList.add(new User(1, "张九", 1, new BigDecimal(85), null));

        SDFrame<FI2<String, BigDecimal>> sdf2 = SDFrame.read(userList)
                .whereNotNull(User::getBanJi)
                .whereBetween(User::getLevel, 0, 1)
                .groupBySum(User::getBanJi, User::getScore)
                .sortDesc(FI2::getC2)
                .cutFirst(2);
        sdf2.show();


        SDFrame<User> sdf3 = SDFrame.read(userList)
                .whereBetween(User::getLevel,1,1)   // 过滤一、二年级含[1,2]
                .whereBetweenR(User::getLevel,1,2)  // 过滤一、二年级不含一年级
                .whereBetweenL(User::getLevel,3,6)  // 过滤一、二年级不含二年级
                .whereNotNull(User::getBanJi) // 过滤班级不为空的数据, 兼容了空字符串''的判断
                .whereGt(User::getLevel,1)   // 过滤一年级以上
                .whereGe(User::getLevel,1)   // 过滤一年级以上含一年级
                .whereLt(User::getLevel,2)   // 过滤而年级以下
                .whereIn(User::getLevel, Arrays.asList(1,3)) // 过滤一年级、三年级
                .whereNotIn(User::getLevel, Arrays.asList(3,7,8)); // 过滤年龄不为为3岁 或者7岁 或者 8岁的数据
               /* .whereEq()
                .whereNotEq()
                .whereLike()
                .whereLikeLeft()
                .whereLikeRight()*/



        JDFrame<User> sdf4 = JDFrame.read(userList);
        User s1 = sdf4.max(User::getScore);// 获取分数最高的学生
        BigDecimal s2  = sdf4.maxValue(User::getScore);      // 获取学生里最高的分数
        User s3 = sdf4.min(User::getScore);// 获取分数最低的学生
        BigDecimal s4  = sdf4.minValue(User::getScore);      // 获取学生里最低的分数
        BigDecimal s5 = sdf4.avg(User::getScore); // 获取所有学生的分数的平均值
        BigDecimal s6 = sdf4.sum(User::getScore); // 获取所有学生的分数合计



        JDFrame<User> sdf5 = JDFrame.read(userList);
        // 等价于 select banJi,sum(score) ... group by banJi
        List<FI2<String, BigDecimal>> a = sdf5.groupBySum(User::getBanJi, User::getScore).toLists();
        // 等价于 select banJi,max(score) ... group by banJi
        List<FI2<String, BigDecimal>> a2 = sdf5.groupByMaxValue(User::getBanJi, User::getScore).toLists();
        //  与 groupByMaxValue 含义一致,只是返回的是最大的值对象
        List<FI2<String, User>> a3 = sdf5.groupByMax(User::getBanJi, User::getScore).toLists();
        // 等价于 select banJi,min(age) ... group by banJi
        List<FI2<String, BigDecimal>> a4 = sdf5.groupByMinValue(User::getBanJi, User::getScore).toLists();
        // 等价于 select banJi,count(*) ... group by banJi
        List<FI2<String, Long>> a5 = sdf5.groupByCount(User::getBanJi).toLists();
        // 等价于 select banJi,avg(score) ... group by banJi
        List<FI2<String, BigDecimal>> a6 = sdf5.groupByAvg(User::getBanJi, User::getScore).toLists();

        // 等价于 select banJi,sum(score),count(score) group by banJi
        List<FI3<String, BigDecimal, Long>> a7 = sdf5.groupBySumCount(User::getBanJi, User::getScore).toLists();
        // (二级分组)等价于 select banJi,level,sum(score),count(score) group by banJi,level
        List<FI3<String, Integer, BigDecimal>> a8 = sdf5.groupBySum(User::getBanJi, User::getLevel, User::getScore).toLists();
        // (三级分组)等价于 select banJi,level,name,sum(score),count(score) group by banJi,level,name
        List<FI4<String, Integer, String, BigDecimal>> a9 = sdf5.groupBySum(User::getBanJi, User::getLevel, User::getName, User::getScore).toLists();



        // 等价于 order by score desc
        SDFrame.read(userList).sortDesc(User::getScore);
        //  (多级排序) 等价于 order by score desc, level asc.
        SDFrame.read(userList).sortAsc(Sorter.sortDescBy(User::getScore).sortAsc(User::getLevel));
        // 等价于 order by score asc
        SDFrame.read(userList).sortAsc(User::getScore);
        // 使用Comparator 排序
        SDFrame.read(userList).sortAsc(Comparator.comparing(e -> e.getLevel() + e.getId()));




        JDFrame<User> frame = JDFrame.read(userList);
        MaxMin<User> maxMin = frame.maxMin(User::getScore) ;
        System.out.println("最小:" + JSONObject.toJSONString(maxMin.getMin()));
        System.out.println("最大:" + JSONObject.toJSONString(maxMin.getMax()));
    }


    @Data
    public static class User {

        private int id;
        private String name;
        private int level;
        private String banJi;
        private BigDecimal score;

        public User(int id, String name, int level, BigDecimal score, String banJi) {
            this.id = id;
            this.name = name;
            this.level = level;
            this.score = score;
            this.banJi = banJi ;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值