Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >第一次给hutool提的pr

第一次给hutool提的pr

作者头像
花花522
发布于 2023-03-07 08:04:41
发布于 2023-03-07 08:04:41
42700
代码可运行
举报
文章被收录于专栏:花花爱咖啡花花爱咖啡
运行总次数:0
代码可运行

hutool是什么

官网:https://www.hutool.cn/

官方原话

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

hutool能做什么

依旧是官网的原话

Hutool的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免“复制粘贴”代码的问题,彻底改变我们写代码的方式。

以计算MD5为例:

  • 👴【以前】打开搜索引擎 -> 搜“Java MD5加密” -> 打开某篇博客-> 复制粘贴 -> 改改好用
  • 👦【现在】引入Hutool -> SecureUtil.md5()

Hutool的存在就是为了减少代码搜索成本,避免网络上参差不齐的代码出现导致的bug。

hutool有什么

既然说了hutool是一个工具包,那他到底能封装了哪些

一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:

模块

介绍

hutool-aop

JDK动态代理封装,提供非IOC下的切面支持

hutool-bloomFilter

布隆过滤,提供一些Hash算法的布隆过滤

hutool-cache

简单缓存实现

hutool-core

核心,包括Bean操作、日期、各种Util等

hutool-cron

定时任务模块,提供类Crontab表达式的定时任务

hutool-crypto

加密解密模块,提供对称、非对称和摘要算法封装

hutool-db

JDBC封装后的数据操作,基于ActiveRecord思想

hutool-dfa

基于DFA模型的多关键字查找

hutool-extra

扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)

hutool-http

基于HttpUrlConnection的Http客户端封装

hutool-log

自动识别日志实现的日志门面

hutool-script

脚本执行封装,例如Javascript

hutool-setting

功能更强大的Setting配置文件和Properties封装

hutool-system

系统参数调用封装(JVM信息等)

hutool-json

JSON实现

hutool-captcha

图片验证码实现

hutool-poi

针对POI中Excel和Word的封装

hutool-socket

基于Java的NIO和AIO的Socket封装

hutool-jwt

JSON Web Token (JWT)封装实现

可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块。

第一次的pr是什么内容

其实是很简单的代码

那天在群里,碰到一个需求,是一个类似请假的场景,每天可以请假好几次嘛,如果时间段内有请假,就不能发起,需求其实很简单,就是判断时间段是否重复.翻了下hutool的文档,暂时没发现有,于是就写了个测试代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.huahua.api;

import lombok.Data;
import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;
import java.util.ArrayList;

/**
 * @author LoveHuahua
 * @date 2022年01月19日 19:20
 * @description believe in yourself
 */
public class TestSameTime {
    @Test
    public void test() {


        //真实请假数据
        LocalDateTime realStartTime = LocalDateTime.of(2022, 1, 1, 11, 49, 10);
        LocalDateTime realEndTime = LocalDateTime.of(2022, 1, 1, 12, 0, 10);

        boolean test1 = checkTest(realStartTime, realEndTime);
        //断言这里是false
        assert !test1;

        LocalDateTime realStartTime2 = LocalDateTime.of(2022, 1, 1, 11, 51, 10);
        LocalDateTime realEndTime2 = LocalDateTime.of(2022, 1, 1, 12, 0, 10);
        boolean test2 = checkTest(realStartTime2, realEndTime2);
        //断言这里是true
        assert test2;


    }

    public boolean checkTest(LocalDateTime realStartTime, LocalDateTime realEndTime3) {
        ArrayList<QingJiaDate> times = new ArrayList<>();
        LocalDateTime oneStartTime = LocalDateTime.of(2022, 1, 1, 10, 10, 10);
        LocalDateTime oneEndTime = LocalDateTime.of(2022, 1, 1, 11, 10, 10);


        QingJiaDate qingJiaDate = new QingJiaDate();
        qingJiaDate.setStartTime(oneStartTime);
        qingJiaDate.setEndTime(oneEndTime);


        LocalDateTime oneStartTime2 = LocalDateTime.of(2022, 1, 1, 11, 20, 10);
        LocalDateTime oneEndTime2 = LocalDateTime.of(2022, 1, 1, 11, 30, 10);


        QingJiaDate qingJiaDate2 = new QingJiaDate();
        qingJiaDate2.setStartTime(oneStartTime2);
        qingJiaDate2.setEndTime(oneEndTime2);


        LocalDateTime oneStartTime3 = LocalDateTime.of(2022, 1, 1, 11, 40, 10);
        LocalDateTime oneEndTime3 = LocalDateTime.of(2022, 1, 1, 11, 50, 10);


        QingJiaDate qingJiaDate3 = new QingJiaDate();
        qingJiaDate3.setStartTime(oneStartTime3);
        qingJiaDate3.setEndTime(oneEndTime3);


        times.add(qingJiaDate);
        times.add(qingJiaDate2);
        times.add(qingJiaDate3);

        boolean check = true;
        for (QingJiaDate time : times) {
            if (realEndTime3.isBefore(time.getStartTime()) || realStartTime.isAfter(time.getEndTime())) {
                continue;
            }
            check = false;
        }
        if (check) {
            System.out.println("时间段可以请假");
        } else {
            System.out.println("时间段不能请假");
        }
        return check;
    }


    /**
     * 请假数据
     */
    @Data
    class QingJiaDate {
        private LocalDateTime startTime;
        private LocalDateTime endTime;
    }

}

大概就是创建了一个集合,然后初始化了几个数据,之后模拟了两个请假的时间段,并且使用肉眼判断时间段是否符合要求,然后加上断言,形成的测试案例,按逻辑是正常的

测试之后开始提交pr

  • fork仓库
    • 直接gitee中仓库首页点击fork确认就ok
  • 拉取代码
    • 从fork之后的地址拉取
    • 注意是之后,如果从之前拉取的可以直接修改push地址,也行
  • 开始修改 我的修改 /** * 第二个事件段是否在第一个时间段的内部 * 需要注意的是比如第一个时间段的结尾是23:59:59 第二天开始需要是00:00:00 相同也是重复 * * @param realStartTime 第一个时间段的开始时间 * @param realEndTime 第一个时间段的结束时间 * @param startTime 第二个时间段的开始时间 * @param endTime 第二个时间段的结束时间 * @return true 表示时间有重合 */ public static boolean isOverlap(LocalDateTime realStartTime, LocalDateTime realEndTime, LocalDateTime startTime, LocalDateTime endTime) { return startTime.isAfter(realEndTime) || endTime.isBefore(realStartTime); } /** * jdk新特新的支持,并没发现什么场合,因为拿不到泛型 * 第二个事件段是否在第一个时间段的内部 * 需要注意的是比如第一个时间段的结尾是23:59:59 第二天开始需要是00:00:00 相同也是重复 * * @param realStartTime 第一个时间段的开始时间 * @param realEndTime 第一个时间段的结束时间 * @param startTime 第二个时间段的开始时间 * @param endTime 第二个时间段的结束时间 * @return true 表示没有时间有重合 */ public static boolean isOverlap(Supplier<LocalDateTime> realStartTime, Supplier<LocalDateTime> realEndTime, Supplier<LocalDateTime> startTime, Supplier<LocalDateTime> endTime) { return isOverlap(realStartTime.get(), realEndTime.get(), startTime.get(), endTime.get()); }
    • 这里我找了下合适的地方,最终找到的是LocalDateTimeUtil
  • 第一个方法
    • 前两个参数是原始时间段
    • 后两个是判断的,在这个业务就是指的新提起的请假时间
  • 第二个方法
    • 其实是了解了一下Supplier这个函数式接口的使用
    • 相当于调用的时候可以LocalDateTime::now

文章到这里肯定没有结束

第一次的pr学到了什么

首先是pr的过程中,这里我放下截图

我不是很能理解这个pr提交的时候,好像有其他人的提交,这里先记录下,有人指点了我补充

  • 处理方法
    • 选择我自己的两次提交
    • 进行了一个cherry pick的操作
  • 效果
  • 提出的问题
  1. 首先是错别字,也不知道是平时太忙还是做事太急

这里也能看出作者的细心,或者是我的粗心吧

  1. 不实用的代码没必要提交,只会增加后期的维护成本

后面我考虑了下,如果目的是将LocalDateTime.now()转成LocalDateTime::now 完全是多此一举,或者技术不够成熟,我没想到他的应用场景

  1. 开源代码讲究更为通用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//ChronoLocalDateTime是一个接口,定义如下
public interface ChronoLocalDateTime<D extends ChronoLocalDate>
        extends Temporal, TemporalAdjuster, Comparable<ChronoLocalDateTime<?>> {
}

实现类只有两个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//ChronoLocalDate也是一个接口
public interface ChronoLocalDate
        extends Temporal, TemporalAdjuster, Comparable<ChronoLocalDate> {

接下来看LocalDateTime的定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public final class LocalDateTime
        implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable {
}

而我们方法用到的两个LocalDateTime的方法分别是isAfterisBefore,而这两个定义在ChronoLocalDateTime这个接口中,我们无需关心LocalDateTime的逻辑,也无需指定入参一定是它,直接改成传递接口,来实现更好的通用性

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 花花爱咖啡 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
应用示例荟萃 | 全方位认识 information_schema
在上一篇《InnoDB 层压缩相关字典表 | 全方位认识information_schema》中,我们详细介绍了InnoDB层记录压缩表信息的字典表,本期我们将为大家带来系列第九篇《应用示例荟萃 | 全方位认识information_schema》,也是"全方位认识information_schema"的最后一篇,下面请跟随我们一起开始information_schema系统库的系统学习之旅吧
老叶茶馆
2020/11/26
7110
Server层表级别对象字典表 | 全方位认识 information_schema
在上一篇《Server层统计信息字典表 | 全方位认识 information_schema》中,我们详细介绍了information_schema系统库的列、约束等统计信息字典表,本期我们将为大家带来系列第三篇《Server层表级别对象字典表 | 全方位认识information_schema》。
老叶茶馆
2020/11/26
1.1K0
InnoDB 层系统字典表 | 全方位认识 information_schema(IFS)
在《Server 层混杂信息字典表 | 全方位认识 information_schema》中,我们详细介绍了information_schema下的状态变量、系统变量、进程状态、字符集和校对规则等字典表,本期我们将为大家带来系列第五篇《InnoDB 层系统字典表 | 全方位认识 information_schema》,下面请跟随我们一起开始information_schema 系统库的系统学习之旅吧。
老叶茶馆
2020/11/26
9770
InnoDB 层锁、事务、统计信息字典表 | 全方位认识 information_schema
在上一篇《InnoDB 层系统字典表|全方位认识 information_schema》中,我们详细介绍了InnoDB层的系统字典表,本期我们将为大家带来系列第六篇《InnoDB 层锁、事务、统计信息字典表|全方位认识 information_schema》
老叶茶馆
2020/11/26
1.4K0
Server 层混杂信息字典表 | 全方位认识 information_schema(中)
该表提供查询关于语句性能分析的信息。其记录内容对应于SHOW PROFILES和SHOW PROFILE语句产生的信息
老叶茶馆
2020/11/26
4120
Server 层混杂信息字典表 | 全方位认识 information_schema(上)
在上一篇《Server层表级别对象字典表 | 全方位认识 information_schema》中,我们详细介绍了information_schema系统库的表级别对象字典表,本期我们将为大家带来系列第四篇《Server层混杂信息字典表 | 全方位认识 information_schema》,下面请跟随我们一起开始information_schema系统库的系统学习之旅吧。
老叶茶馆
2020/11/26
9540
Server 层混杂信息字典表 | 全方位认识 information_schema(下)
该表提供查询关于表级别权限信息,该表中的内容来自mysql.tables_priv
老叶茶馆
2020/11/26
3260
统计信息查询视图|全方位认识 sys 系统库
在上一篇《会话和锁信息查询视图|全方位认识 sys 系统库》中,我们介绍了如何使用 sys 系统库总的视图来查询会话状态信息以及锁等待信息,本期的内容先给大家介绍查询表和索引相关的统计信息快捷视图。下面请跟随我们一起开始 sys 系统库的系统学习之旅吧。
沃趣科技
2018/09/04
2.3K0
统计信息查询视图|全方位认识 sys 系统库
mysql中information_schema库下的COLUMNS_EXTENSIONS表详解
`information_schema.COLUMNS_EXTENSIONS` 表是 MySQL 8.0.22 及以上版本中引入的一个元数据表,用于存储与表列相关的扩展属性。这些属性主要用于存储引擎级别的信息,例如 InnoDB 存储引擎的列属性。下面是对该表的详细解释:
jack.yang
2025/04/05
850
mysql的information_schema下的COLUMNS表详解
`information_schema.COLUMNS` 表是 MySQL 中的一个元数据表,用于存储数据库中所有表的列信息。这个表对于查询和管理数据库结构非常有用,可以帮助您了解每个表中的列定义、数据类型、约束等细节。
jack.yang
2025/04/05
860
mysql中information_schema库下的KEY_COLUMN_USAGE表详解
`information_schema.KEY_COLUMN_USAGE` 表是 MySQL 中的一个元数据表,用于存储关于表的键列信息,包括主键、唯一键以及外键的详细信息。这个表包含了关于哪些列参与了哪些类型的键约束的信息。下面是这个表的详细解释:
jack.yang
2025/04/05
990
MySQL information_schema详解 COLUMNS
如果一个栏位在多个索引中,COLUMN_KEY只会显示其中优先级最高的一个,顺序为PRI, UNI, MUL
bsbforever
2020/08/18
4K0
InnoDB 层压缩相关字典表 | 全方位认识 information_schema
在上一篇《InnoDB 层全文索引字典表|全方位认识 information_schema》中,我们详细介绍了InnoDB层的全文索引字典表,本期我们将为大家带来系列第八篇《InnoDB 层压缩相关字典表|全方位认识 information_schema》,下面请跟随我们一起开始 information_schema 系统库的系统学习之旅吧。
老叶茶馆
2020/11/26
4410
MySQL information_schema详解 KEY_COLUMN_USAGE
https://dev.mysql.com/doc/refman/5.7/en/key-column-usage-table.html
bsbforever
2020/08/18
1.7K0
MySQL字段信息统计机制场景
同事咨询个问题:某个业务基于 INFORMATION_SCHEMA 统计表的信息(比如最大值)向表里面插入数据。
bisal
2023/08/09
4260
MySQL information_schema 系统库介绍
当我们安装好 MySQL 数据库后,会发现数据库实例自带有 information_schema 系统库,你是否有去关注过这个系统库呢?是否有查询过此库中的表数据呢?又是否清楚此库存在的具体作用呢?带着这些疑问,我们一起来看本篇文章。
MySQL技术
2021/08/24
9730
介绍一下 information_schema 库
今天给大家介绍一款 Mysql 中附属的数据库,就是 information_schema 数据库,为什么说是附属呢?是因为这个数据库是在安装 Mysql 的同时就会安装到你电脑上。这个数据库里面主要存储了关于数据库里面的各种库、表、列、注释等信息。这个库对我们有什么用呢?有很大用处,尤其是当一个公司没有数据字典的时候,你就可以通过查看这个数据库,然后自己去梳理字典。
张俊红
2019/06/24
1.9K0
权限系统表 | 全方位认识 mysql 系统库(一)
前面我们已经完整的介绍了performance_schema 、sys、information_schema三个系统库,今天开始我们为大家开启"全方位认识 mysql 系统库"系列,这也是MySQL中的最后一个系统库 ,在更早之前,我们在《MySQL 的 help 命令你真的会用吗?》一文中其实已经介绍过mysql 系统库的帮助信息表了。在接下来的系列文章中,我们将全面介绍 mysql 系统库。下面,请跟随我们一起开始mysql 系统库 的学习之旅吧。
老叶茶馆
2020/12/15
1K0
mysql的information_schema库下COLUMN_STATISTICS表详解
`information_schema.COLUMN_STATISTICS` 表是 MySQL 8.0.16 及更高版本中引入的一个元数据表,用于存储关于表列的统计信息,特别是直方图数据。这些统计信息有助于优化器更准确地估计查询的成本,从而选择更高效的执行计划。
jack.yang
2025/04/05
600
InnoDB 层全文索引字典表 | 全方位认识 information_schema
在上一篇中,我们详细介绍了InnoDB 层的锁、事务、及其相关的统计信息字典表,本期我们将为大家带来系列第七篇《InnoDB 层全文索引字典表 | 全方位认识 information_schema》。
老叶茶馆
2020/11/26
1.2K0
推荐阅读
相关推荐
应用示例荟萃 | 全方位认识 information_schema
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验