Skip to content

@venusdrogon venusdrogon released this Apr 3, 2020 · 3 commits to master since this release

feilong-core 2.1.0 发布了,feilong-core 是一个让 Java 开发更简便的工具包。

  1. 让你从大量重复的底层代码中脱身,提高工作效率;
  2. 让你的代码更简炼,易写、易读、易于维护;

文档地址: http://feilong-core.mydoc.io/

单元测试数 增加至 2259 个, 单元测试覆盖率 增加至 91% ,javadoc 比率 83%

本次升级共有 10 处变更, 具体参见 2.1.0 milestone

[Feature] 🆕

#815 新建 DateUtil.nowTimestamp() 方法

在日常开发过程中,我们经常要生成文件/文件夹名字, 通常使用当前时间的 TIMESTAMP 命名

以前你需要写成 DateUtil.toString(new Date(), TIMESTAMP)

或者写成 DateUtil.nowString(TIMESTAMP) (since 1.14.0)

更或者 DateUtil.toString(Calendar.getInstance().getTime(), DatePattern.TIMESTAMP)

此时你可以写成, (使用静态导入 static import更精简): DateUtil.nowTimestamp() 即可,较少开发量


#809 Dateutil 新增日期字符串区间的比较

com.feilong.core.date.DateUtil.isInTime(String beginDateString,String endDateString,String datePattern)

com.feilong.core.date.DateUtil.isInTime(Date date,String beginDateString,String endDateString,String datePattern)

判断当前时间 是否在格式是pattern的 beginDate 和 endDate两个时间之间.

使用场景:

比如当日达,判断下单的时间是否是 08:00-16:00 之间, 超过这个时间段的订单不能下


#807 Dateutil 新增 将一个时间格式字符串转成另外时间格式字符串方法

com.feilong.core.date.DateUtil.toString(String dateString,String oldPattern,String newPattern)

将一个 oldPattern 格式日期 dateString 字符串 使用新格式 newPattern 转成新的字符串.

示例:

 DateUtil.toString("2020-01-06", "yyyy-MM-dd", "yyyy.MM.dd")="2020.01.06"
 DateUtil.toString("2020-01-06", "yyyy-MM-dd", "yyyy年MM月dd日")="2020年01月06日"

#816 新增 RandomUtil.createRandomString(int) 减少一步代码

Alphabet.DECIMAL_AND_LOWERCASE_LETTERS_DISTINGUISHABLE 随机抽取字符串,拼接成指定长度length的字符串.

说明:

  • 常用于生成验证码
  • 接口传参,比如微信需要 nonce_str ,不长于32位的随机字符串

示例:
RandomUtil.createRandomString(5)

生成的结果是可能是IFSMB


#813 新增 CollectionsUtil.find(Iterable, Map<String, ?>) 方法

找到 iterable中,第一个 propertyName属性名称和值是 propertyValue是 propertyNameAndPropertyValueMap 的对应元素.

示例:
场景: 从list中查找name是 关羽,且年龄是24 的User对象

 List<User> list = new ArrayList<>();
 list.add(new User("张飞", 23));
 list.add(new User("关羽", 24));
 list.add(new User("刘备", 25));
 list.add(new User("关羽", 50));
 
 Map<String, ?> map = toMap("name", "关羽", "age", 24);
 LOGGER.info(JsonUtil.format(CollectionsUtil.find(list, map)));

返回:

 {
 "age": 24,
 "name": "关羽"
 }

说明:
返回第一个匹配对象


#808 CollectionsUtil 根据对象多个属性值去重

com.feilong.core.util.CollectionsUtil.removeDuplicate(Collection<O>, String...)

去重,返回指定属性 propertyNames 组合的值都不重复元素的新list (原集合对象不变).

比如下列user示例, 如果id相等,并且userInfo.age 属性值也相等 那么判定是重复对象

示例:

 User user1 = new User(1L);
 user1.setUserInfo(new UserInfo(15));
 
 User user2 = new User(1L);
 user2.setUserInfo(new UserInfo(16));
 
 User user3 = new User(1L);
 user3.setUserInfo(new UserInfo(15));
 
 List<User> list = toList(user1, user2, user3);
 
 List<User> removeDuplicate = CollectionsUtil.removeDuplicate(list, "id", "userInfo.age");
 
 assertThat(removeDuplicate, contains(user1, user2));
 assertSame(2, removeDuplicate.size());

注意:

  • 如果原 objectCollection 是有序的,那么返回的结果参照原 objectCollection元素顺序
  • 原 objectCollection不变

[Update]

  • #818 基于sonar8 修复坏味道 坏味道

[版本升级]

  • none

[Javadoc]

  • #811 修改 AggregateUtil.sum(Iterable<O>, String...) javadoc
  • #810 修改 AggregateUtil.groupCount(Iterable<O>, String...) javadoc
  • #812 完善 DefaultRuntimeException(String, Object...) 注释

[Remove]

  • none

[Fix Bug] 🐛

  • none
Assets 2

@venusdrogon venusdrogon released this Oct 17, 2019 · 20 commits to master since this release

feilong-core 2.0.1,让 Java 开发更简便的工具包

本次升级共有 1 处变更, 具体参见 2.0.1 milestone

2.0.1 文档地址: http://feilong-core.mydoc.io/

单元测试数 增加至 2197 个, 单元测试覆盖率 增加至 91% ,javadoc 比率 83%

[Feature] 🆕

  • #804 新建 ParamUtil.toNaturalOrderingJoinValue(Map<String, String>)

singleValueMap 转成自然排序, 然后仅将value直接拼接成字符串(不使用 = 和& 分隔).

示例:

 Map<String, String> map = newHashMap();
 map.put("service", "create_salesorder");
 map.put("_input_charset", "gbk");
 map.put("totalActual", "210.00");
 map.put("address", "江苏南通市通州区888组888号");
 LOGGER.debug(ParamUtil.toNaturalOrderingJoinValue(map));

返回:

 gbk江苏南通市通州区888888号create_salesorder210.00

规则:
首先将singleValueMap 使用 SortUtil.sortMapByKeyAsc(Map) 进行排序, 然后将map的value 直接连接

说明:
常用于和第三方对接数据(比如银联大华捷通,生成 待签名的字符串)

  • 该方法不会执行encode操作,使用原生值进行拼接
  • 对于 null key或者null value的处理:
  • 如果 singleValueMap 中,如果有 value 是 null,那么会使用 StringUtils.EMPTY 进行拼接

示例:

 Map<String, String> map = newHashMap();
 map.put("totalActual", null);
 map.put("province", "江苏省");
 
 LOGGER.debug(ParamUtil.toNaturalOrderingKeyJoinValue(map));

返回:

江苏省

[Update]

  • none

[版本升级]

  • none

[Remove]

  • none

[Fix Bug] 🐛

  • none

[Javadoc]

  • none

[Junit Test]

  • none
Assets 2

@venusdrogon venusdrogon released this Sep 13, 2019 · 23 commits to master since this release

feilong-core 2.0.0,让 Java 开发更简便的工具包

本次升级共有 3 处变更, 具体参见 2.0.0 milestone

2.0.0 文档地址: http://feilong-core.mydoc.io/

单元测试数 增加至 2192 个, 单元测试覆盖率 增加至 91% ,javadoc 比率 83%

[Feature] 🆕

  • #801 新建 ThreadUtil.execute(List<T>, int, PartitionPerHandler<T>)

给定一个待解析的 list,设定每个线程执行多少条 eachSize,使用自定义的 partitionRunnableBuilder,自动构造多条线程并运行.

主要是用来简化 **execute(List, int, PartitionRunnableBuilder) **调用

重构:

对于以下代码:

 ThreadUtil.execute(list, 5, new PartitionRunnableBuilder<String>(){
 
     @Override
     public Runnable build(final List<String> perBatchList,PartitionThreadEntity partitionThreadEntity,Map<String, ?> paramsMap){
 
         return new Runnable(){
 
             @Override
             public void run(){
                 map.putAll(handle(perBatchList, noList));
             }
         };
     }
 });

可以重构成:

 ThreadUtil.execute(list, 5, new PartitionPerHandler<String>(){
 
     @Override
     public void handle(List<String> perBatchList,PartitionThreadEntity partitionThreadEntity,Map<String, ?> paramsMap){
         map.putAll(CopyrightTest.this.handle(perBatchList, noList));
     }
 });

上述事例,可以从 14 行代码, 精简到 7 行代码

  • #794 新增 PartitionPerHandler ,让多线程调用更简单
  • #803 新建 ThreadUtil.execute(List<T>, PartitionThreadConfig, Map<String, ?>, PartitionPerHandler<T>)
  • #802 新建 ThreadUtil.execute(List<T>, int, Map<String, ?>, PartitionPerHandler<T>)

[Update]

  • #800 新建 com.feilong.core.lang.thread 包, 将thread 相关类 移动进来 remove 不兼容
  • #799 AbstractPartitionThreadExecutor actualExcute name change to actualExecute rename 不兼容 坏味道
  • #798 PartitionThreadExecutor 方法名字从 excute 改成 execute rename 不兼容 坏味道
  • #797 PropertyValueObtainer.getDataUseSpring(Object, String) log trace 单词写错了 rename 不兼容 坏味道

[版本升级]

  • none

[Remove]

  • none

[Fix Bug] 🐛

  • none

[Javadoc]

  • #793 完善 ThreadUtil.sleep(long) 注释
  • #792 完善 ThreadUtil.execute(Runnable, int) 注释

[Junit Test]

  • none
Assets 2

@venusdrogon venusdrogon released this Aug 28, 2019 · 35 commits to master since this release

feilong-core 1.14.3,让 Java 开发更简便的工具包

本次升级共有 3 处变更, 具体参见 1.14.3 milestone

1.14.3 文档地址: http://feilong-core.mydoc.io/

单元测试数 增加至 2164 个, 单元测试覆盖率 增加至 91% ,javadoc 比率 83%

[Feature] 🆕

  • #788 sort util 封装数组或者集合 固定的排序方法

com.feilong.core.util.SortUtil
新增 sortListByFixedOrderArray(List<T>, T...)sortListByFixedOrderList(List<T>, List<T>) 方法

对 集合 list 按照指定的固定顺序 fixedOrderItemList 进行排序.

说明:

默认使用的是 UnknownObjectBehavior.AFTER ,不在指定固定顺序的元素将排在后面

示例:

 assertThat(
                 sortListByFixedOrderList(toList("张飞", "关羽", "刘备"), toList("刘备", "张飞", "关羽")), //
                 contains("刘备", "张飞", "关羽"));

重构:

对于以下代码:

 try{
    Collections.sort(
        list,
        new FixedOrderComparator<>(
            StoPropertyConstants.PRPT_ITEM_HYPELAUNCH,
            StoPropertyConstants.PRPT_ITEM_MIADIDAS_VALUE_EN,
            StoPropertyConstants.PRPT_ITEM_PRESONALLZATION_CODE,
            StoPropertyConstants.PRPT_ITEM_PERSALES_CODE,
            StoPropertyConstants.PRPT_ITEM_VIP_CODE,
            StoPropertyConstants.PRPT_ITEM_COMINGSOON_CODE,
            StoPropertyConstants.PRPT_ITEM_DISCOUNT_CODE,
            StoPropertyConstants.PRPT_ITEM_NORMAL_CODE,
            StoPropertyConstants.PRPT_ITEM_NOSALE));
 }catch (Exception e){
     LOGGER.error("itemType sort error:{},itemType:{}", e, JsonUtil.format(itemType));
 }

可以重构成:

com.feilong.core.util.SortUtil.sortListByFixedOrderList(
    list,
    toList(
            StoPropertyConstants.PRPT_ITEM_HYPELAUNCH,
            StoPropertyConstants.PRPT_ITEM_MIADIDAS_VALUE_EN,
            StoPropertyConstants.PRPT_ITEM_PRESONALLZATION_CODE,
            StoPropertyConstants.PRPT_ITEM_PERSALES_CODE,
            StoPropertyConstants.PRPT_ITEM_VIP_CODE,
            StoPropertyConstants.PRPT_ITEM_COMINGSOON_CODE,
            StoPropertyConstants.PRPT_ITEM_DISCOUNT_CODE,
            StoPropertyConstants.PRPT_ITEM_NORMAL_CODE,
            StoPropertyConstants.PRPT_ITEM_NOSALE));
  • #789 新建 ComparatorUtil

  • #791 新建 ContainsStringPredicate

使用场景,参考

    <bean class="com.feilong.context.converter.IfStringToBeanConverter">

        <property name="predicate">
            <bean class="com.feilong.core.util.predicate.ContainsStringPredicate" p:searchCharSequence="TRADE_NOT_EXIST" />
        </property>

        <property name="trueStringToBeanConverter">
            <bean class="com.feilong.netpay.alipay.query.AlipayTradeNotExistStringToBeanConverter" />
        </property>

        <property name="falseStringToBeanConverter">
            <bean class="com.feilong.context.converter.XMLMapBuilderStringToBeanConverter">
                <property name="beanClass" value="com.feilong.netpay.alipay.query.AlipaySingleQueryResultCommand" />

                <property name="nameAndValueMapBuilder">
                    <bean class="com.feilong.context.converter.builder.XmlNodeNameAndValueMapBuilder" p:xpathExpression="/alipay/response/trade/*" />
                </property>

                <property name="beanBuilder">
                    <bean class="com.feilong.context.converter.builder.AliasBeanBuilder" />
                </property>
            </bean>
        </property>
    </bean>

[Update]

  • none

[版本升级]

  • none

[Remove]

  • none

[Fix Bug] 🐛

  • none

[Javadoc]

  • none

[Junit Test]

  • none
Assets 2

@venusdrogon venusdrogon released this Jul 27, 2019 · 40 commits to master since this release

:bookmark:upgrade-version-1.14.2
Assets 2

@venusdrogon venusdrogon released this Jul 13, 2019 · 42 commits to master since this release

feilong-core 1.14.0 发布了,feilong-core 是一个让 Java 开发更简便的工具包。

  1. 让你从大量重复的底层代码中脱身,提高工作效率;
  2. 让你的代码更简炼,易写、易读、易于维护;

文档地址: http://feilong-core.mydoc.io/

单元测试数 增加至 2141 个, 单元测试覆盖率 增加至 91% ,javadoc 比率 83%

本次升级共有 8 处变更, 具体参见 1.14.0 milestone

[Feature] 🆕

  • #785 DateUtil �新增 now()nowString( pattern) 方法 简化开发

此时此刻的 Date.

使用静态导入 static import,开发效率要高于自己写 new Date()

  • #781 新增 MapUtil.newLinkedHashMap(Map<K, V>)
  • #780 新增 MapUtil.newHashMap(Map<K, V>)
  • #779 新增 MapUtil.newTreeMap(Map<K, V>)
  • #778 新增 MapUtil.newConcurrentHashMap(Map<K, V>)

[Update]

  • #786 ConvertUtil.toString(Object) 优化改造 important

支持 数组, list ,默认逗号拼接输出

 ConvertUtil.toString(toList("张飞", "关羽", "", "赵云"))  =   "张飞,关羽,,赵云"
 ConvertUtil.toString(toArray("张飞", "关羽", "", "赵云"))  =   "张飞,关羽,,赵云"
 ConvertUtil.toString(toArray(null, "关羽", "", "赵云"))  =   ",关羽,,赵云"

[版本升级]

  • none

[Remove]

  • none

[Fix Bug] 🐛

  • none

[Javadoc]

  • #784 增加 com.feilong.core.bean.ConvertUtil.toSet(T...) null Varargs javadoc
  • #783 增加 com.feilong.core.bean.ConvertUtil.toList(T...) null Varargs javadoc

[Junit Test]

  • none
Assets 2

@venusdrogon venusdrogon released this Apr 30, 2019 · 56 commits to master since this release

feilong-core 1.13.2 发布了,feilong-core 是一个让 Java 开发更简便的工具包。

  1. 让你从大量重复的底层代码中脱身,提高工作效率;
  2. 让你的代码更简炼,易写、易读、易于维护;

文档地址: http://feilong-core.mydoc.io/

单元测试数 增加至 2124 个, 单元测试覆盖率 增加至 91% ,javadoc 比率 83%

本次升级共有 8 处变更, 具体参见 1.12.1 milestone

[Feature] 🆕

  • #770 新增 AggregateUtil.groupSum(Iterable<O> beanIterable, String keyPropertyName, String sumPropertyName)

迭代 beanIterable,取元素 keyPropertyName 的值为 key ,累计 sumPropertyName 属性值 为 value,返回 map.

示例:

统计 user list 按照姓名分组, 累加每个人的 age 总和

List<User> list = toList(//
               new User("张飞", 20),
               new User("关羽", 20),
               new User("刘备", 20),
               new User("刘备", 20));

Map<String, BigDecimal> map = AggregateUtil.groupSum(list, "name", "age");

assertThat(
               map,
               allOf(//
                               hasEntry("刘备", toBigDecimal(40)),
                               hasEntry("张飞", toBigDecimal(20)),
                               hasEntry("关羽", toBigDecimal(20))));
  • #771 新增 AggregateUtil.groupSum(Iterable<O>, String, String, Predicate<O>)

  • #769 新增 MapUtil.putSumValue(Map<String, BigDecimal>, String, Number)

将key和value 累加的形式put到 map中,如果map中存在key,那么累加value值;如果不存在那么直接put.

常用于数据统计, 比如 com.feilong.core.util.AggregateUtil.groupSum(Iterable, String, String)

示例:

 Map<String, BigDecimal> map = new HashMap<>();
 MapUtil.putSumValue(map, "1000001", 5);
 MapUtil.putSumValue(map, "1000002", 5);
 MapUtil.putSumValue(map, "1000002", 5);
 LOGGER.debug(JsonUtil.format(map));

返回:

 {
 "1000001": 5,
 "1000002": 10
 }
  • #776 新增 NotNullOrEmptyStringPredicate
  • #775 新建 RegexStringPredicate
  • #773 新建 StringToDateTransformer

[Update]

  • #772 BeanUtil.newDynaBean(Map<String, ?>) map 改成Map

[版本升级]

  • none

[Remove]

  • none

[Fix Bug] 🐛

  • #774 RegexUtil.matches(String, CharSequence) 如果 CharSequence 是 null 返回 false 而不应该是 NPE

[Javadoc]

  • none

[Junit Test]

  • none
Assets 2

@venusdrogon venusdrogon released this Apr 17, 2019

:bookmark:upgrade-version-1.13.1
Assets 2

@venusdrogon venusdrogon released this Jan 16, 2019 · 71 commits to master since this release

:bookmark:upgrade-version-1.13.0
Assets 2

@venusdrogon venusdrogon released this Nov 23, 2018 · 74 commits to master since this release

:bookmark:upgrade-version-1.12.10
Assets 2
You can’t perform that action at this time.