日常开发中,经常用org.apache.commons.lang3.builder.ToStringBuilder工具类来记录日志,比如:

package com.cnblogs.yjmyzz;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import java.util.Date; /**
* @author 菩提树下的杨过
* @className ToStringTest
* @description TODO
* @date 2022/5/8 07:24
*/
public class ToStringTest { static class DemoObject {
private String a;
private String b = "";
private String c = "abc";
private Date d = new Date();
private Integer e;
} public static void main(String[] args) {
DemoObject obj = new DemoObject();
//原始toString()
System.out.println(obj); //ToStringBuilder的输出(默认风格)
System.out.println(ToStringBuilder.reflectionToString(obj)); //ToStringBuilder的输出(短前缀风格)
System.out.println(ToStringBuilder.reflectionToString(obj, ToStringStyle.SHORT_PREFIX_STYLE));
}
}

输出如下:

com.cnblogs.yjmyzz.ToStringTest$DemoObject@1786dec2
com.cnblogs.yjmyzz.ToStringTest$DemoObject@1786dec2[a=<null>,b=,c=abc,d=Sun May 08 07:35:50 CST 2022,e=<null>]
ToStringTest.DemoObject[a=<null>,b=,c=abc,d=Sun May 08 07:35:50 CST 2022,e=<null>]

从结果上看:

行1:也就是Object默认的toString()输出,只有类名以及对象实例的hashCode,内部成员信息完全看不出来

行2:使用ToStringBuilder工具类输出对象信息,包含了几乎所有完整信息

行3:如果觉得行2的输出,类名太长,可以指定短前缀风格

但是不管是行2还是行3的风格,当field值为null或字符串时,仍然会输出,如果想把这些空值给过滤掉,可以参考下面的方法,加一个类:

package com.cnblogs.yjmyzz;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import java.lang.reflect.Field;
import java.util.Date; /**
* @author 菩提树下的杨过
* @className ToStringTest
* @description TODO
* @date 2022/5/8 07:24
*/
public class ToStringTest { static class DemoObject {
private String a;
private String b = "";
private String c = "abc";
private Date d = new Date();
private Integer e;
} /**
* 新增的工具类
*/
static class ToStringUtil {
public static String toStringWithAttributes(Object ofInterest, ToStringStyle style) {
ReflectionToStringBuilder builder = new ReflectionToStringBuilder(ofInterest, style) {
@Override
protected boolean accept(Field field) {
try {
Object value = field.get(ofInterest);
return super.accept(field) && value != null && !"".equalsIgnoreCase(value.toString());
} catch (IllegalAccessException e) {
return super.accept(field);
}
}
};
return builder.toString();
}
} public static void main(String[] args) {
DemoObject obj = new DemoObject();
//原始toString()
System.out.println(obj); //去掉null和空字符串的输出
System.out.println(ToStringUtil.toStringWithAttributes(obj, ToStringStyle.SHORT_PREFIX_STYLE)); }
}

再次运行:

com.cnblogs.yjmyzz.ToStringTest$DemoObject@1786dec2
ToStringTest.DemoObject[c=abc,d=Sun May 08 07:43:01 CST 2022]

从输出上看,null值以及空字符串都被成功过滤掉了

ToStringBuilder如何忽略null和空字符串的更多相关文章

  1. MySQL中NULL与空字符串

    一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串’  ’是相同的.这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的.NULL是指没有值,而”则表示值是存在的,只不过是个 ...

  2. 【转】oracle中的NULL、''(空字符串)以及'_'(空格)

    在Oracle中使用null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? 1.NULL和''(空字符串)是一个意思 注:为了便于区分空字符串和空格,下面的示例均以'_'代表空格. ...

  3. Java知识点-判断null、空字符串和空格

    Java知识点-判断null.空字符串和空格 // 判断headerKey是否为null,空字符串或者空格 if (headerKey != null && headerKey.len ...

  4. Oracle中Null与空字符串' '的区别

    含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除 ...

  5. SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间

    SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间 这里只讨论字符串类型,int.datetime.text这些数据类型就不讨论了,因为是否节省空间是根据数据类型来定的 在写这篇文 ...

  6. PHP递归方式把一个数组里面的null转换为空字符串”的方法

    在一些接口的调用中,直接查询数据库出来的字段可能为null字段,但是为了简便前端的判断,需要把null转换成空字符串'',这个时候就需要递归的方式进行.直接上代码如下: //递归方式把数组或字符串 n ...

  7. 关于StringUtils类isEmpty、isNotEmpty、isBlank、isNotBlank针对null、空字符串和空白字符(如空格、制表符)的区别

    isEmpty | null | 空字符串("")|空白字符(空格.制表符)| | isEmpty | true | true | false | | isNotEmpty | f ...

  8. sql中null 和 ‘’(空字符串)

    sql 中 null  和 空字符串的区别方式 在Silverlight中  数据库 需要与实体类进行映射, 假如实体类不允许为null,则 select '' as 列名  from  表名字:   ...

  9. Django与SQL语言中——NULL与空字符串的区别

    SQL有指定空值的独特方式,它把空值叫做NULL. Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中, ...

  10. laravel之null替换空字符串中间件

    在laravel写接口的时候免不了数据库中保存null,可用诸如设置ORM的访问器或以下方法处理 $goods->name?$goods->name:''; 其实可以利用路由中间件,在需要 ...

随机推荐

  1. pandas 将excle两行或多行文本合并为一行

    原有excle 目的: # j加载另一份数据源 import pandas as pd import xlrd import time from xlutils.copy import copy fr ...

  2. 89.4K star!这个开源LLM应用开发平台,让你轻松构建AI工作流!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Dify 是一款开源的 LLM 应用开发平台,通过直观的可视化界面整合 AI 工作流.RAG ...

  3. c#开发完整的Socks5代理客户端与服务端(已完结)

    本文我们介绍下如何在Windows系统上开发一个代理本机流量的客户端,并且对接我们之前开发的Socks5服务端,实现整个代理的一条龙.对于Socks5代理的服务端的开发可以详见之前的文章. 目录 本机 ...

  4. ASP.NET Core 之路由相关

    ASP.NET Core中路由的过程:routing middleware把传入的url与一系列模板进行比对,选择相应的endpoint handler,并将其记录在HttpContext上的requ ...

  5. 解决git clone 速度慢问题比较赞的方法

    使用国内镜像,目前已知的GitHub国内镜像网站有github.com.cnpmjs.org和git.sdut.me. 在clone 某项目时候可将github.com替换为github.com.cn ...

  6. RocketMQ源码详解(消息存储、Consumer)

    消息存储 消息存储核心类 private final MessageStoreConfig messageStoreConfig; //消息配置属性 private final CommitLog c ...

  7. CVE-2021-41773 && CVE-2021-42013拆解复现

    CVE-2021-41773 && CVE-2021-42013 参考了这个师傅的WP https://www.jianshu.com/p/3076d9ec68cf CVE-2021- ...

  8. L1-5、Prompt 写作中的常见误区

    语言很自然,但写法要"工程化". 为什么要重视 Prompt 的写作规范? Prompt 是"给 AI 的任务指令",不清不楚,AI 就会"乱猜&qu ...

  9. OAuth2密码模式:信任的甜蜜陷阱与安全指南

    title: OAuth2密码模式:信任的甜蜜陷阱与安全指南 date: 2025/05/29 14:56:19 updated: 2025/05/29 14:56:19 author: cmdrag ...

  10. 使用 TRL 训练Reward Model奖励模型

    训练过程 在此示例中,将微调"distilroberta-base"模型. 该formatting_func函数将指令与所选和拒绝的响应相结合,创建两个新字符串.这些字符串被标记化 ...