日常开发中,经常用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. 【BUG】Python3|安装python3-pip依赖缺失,might want to run ‘apt --fix-broken install‘ to correct these. unment

    今天装python,版本装错了. 然后删又删不掉,装pip又装不上,报错是这样的: 想装的时候: 7f2a0f717aa3:~/$ sudo apt-get install python3-pip p ...

  2. Lasso回归及其R语言操作

    Lasso回归形式: 确定lamda使得RSS-lamda*sum(Bi)最小,RSS为普通最小二乘估计的回归平方和. 作用: 确定哪些变量更重要,lamda从0到1过程中,哪些变量的系数最慢趋于0, ...

  3. 树-BST基本实现

    之前的数组, 栈, 链表, 队列等都是顺序数据结构, 这里来介绍一个非顺序数据结构, 树. 树在处理有层级相关的数据时非常有用, 还有在存储数据如数据库查询实现等场景也是高频使用. 作为一种分层数据的 ...

  4. C#缩放图片形成新的图片

    // 加载原始Bitmap Bitmap originalBitmap = new Bitmap("C:\\Users\\Administrator\\Desktop\\test.bmp&q ...

  5. ASP.NET Core MiniAPI中 EndPoint相关

    1.状态码返回之演化之路 1.1最基本的就是用Results或者TypedResults返回带有状态码的响应(可选Json响应体) app.MapGet("/fruit/{id}" ...

  6. 通过DirectXTK,将.obj,.fbx,.dae,等常见三维格式,转换为.cmo格式

    (1)下载DirectXTK项目:https://github.com/microsoft/DirectXTK (2)VS 打开该项目,右键项目,生成依赖性-自定义 (3)勾选MeshContentT ...

  7. Visual Studio 快捷键(收藏)

    代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + M: 折叠或者展开当前方法 Ctrl + ...

  8. 【拥抱鸿蒙】Flutter+Cursor轻松打造HarmonyOS应用(一)

    前言 在移动应用开发领域,Flutter以其出色的跨平台能力和高效的开发体验赢得了众多开发者的青睐,是许多移动开发者混合开发的首选. 随着HarmonyOS的崛起,许多开发者开始探索如何将Flutte ...

  9. 2024牛客多校3A Bridging the Gap 2

    希望更丰富的展现?来我搭建的网站看看 Problem \(n\) 个人乘船过河,该船容纳人的上限为 \(R\),并且需要至少 \(L\) 个人才能操作.每次过河时所有人都需划船,使船上所有人的耐力值减 ...

  10. AtCoder Beginner Contest 357-D

    Problem For a positive integer \(N\), let \(V_N\) be the integer formed by concatenating \(N\) exact ...