Java 控制台表格打印 List 数据信息

举杯邀明月,对影成三人。

1 前言

在前文中介绍了一个订单拆单的逻辑,最后通过模型的计算输出了订单明细的拆单结果,在通常情况下,可以使用 lombook 通过日志的方式来打印结果,但是这样的展示不太直观,作为一个有追求的码农,就想通过表格打印的方式来展现结果,搜索下来没有找到合适工具。于是就自研了一个打印集合数据的工具,方便数据的展现。

2 数据分析

通常情况下打印数据需要使用制表符\t来处理,但是由于打印的数据长度不一致,就会导致数据打印的长短不一,表现出来的效果就是数据展示不美观。表现出来的效果如下所示:

复制代码
|序号 |姓名 |年龄| 地址 |
|123|赵小川|23|中国北京|
|456|小李 |12|河南郑州|

那怎么才能把数据按照固定的长度进行打印呢,在 javaString.format 方法可以进行填充,这里可以左对齐或者右对齐的方式,如下图所示:

arduino 复制代码
// %-10s 左对齐 固定宽度 10
// %10s  右对齐 固定宽度 10
String.format("%10s", "小明") # 数据输出的长度即10,不足的部分使用空格填充

但是怎么能拿到数据的长度呢,在打印数据前,需要拿到每一列数据的长度,包括表头的数据长度,然后再打印数据时,就可以固定该列的长度,即可实现表格的每一列宽度固定,就能够打印一个整齐划一的表格。

通过以上的操作,就可以实现一个表格打印的基本功能,但是输入的内容需要保证都是字符串,而且需要需要手动处理表头信息,这一点非常的繁琐。java 是一个面向对象的语言,如果一个实体类中有十多个字段,那么需要输入的表头和数据转换都是一个复杂而繁琐的操作。通常情况下,我们拿到的数据都是一个 list 集合数据,那么能不能通过反射的方式来获取实体类的字段呢,然后通过反射的方式获取每个对象的字段所对应的值,答案是可以的。

通过 hutools 提供的反射工具类可以实现前面提到的需求,完成对象集合到字符串集合的转换。

ini 复制代码
# 通过 ReflectUtil.getFieldMap 获取对象的属性
Map<String, Field> fieldMap = ReflectUtil.getFieldMap(OrderCalNode.class);
# 通过 ReflectUtil.getFieldValue 通过对象的属性名称来获取对应的值
Object val = ReflectUtil.getFieldValue(cal, field);

通常情况下,在表格的表头和头尾部的部分需要打印数据的分割行,以便优雅的展示数据和分区数据行和表头行信息。

3 表格构建

通过以上的数据分析我们已经搞定了所有的关键环节,那么可以开始编程了,首先进行数据对象的转换:

添加数据行时,需要根据根据每个数据列的长度进行格式化数据行,通过 CollUtil.join 的方式来连接每个字符串。

最终通过 printResult 的方法来组装最终的结果,首先计算数据列的长度,拼装分割行的分割行,最后添加每一列的数据即可。

通过以上的操作,我们可以得到在控制台打印的结果,这才是作者想要的格式,简直不要太完美。

4 总结

在本文中可以通过 String 字符串的格式化 format,完成数据的格式化打印。使用 hutools 的工具类使用反射的方式来处理对象集合到字符串集合的转换,并通过对象来获取表头列表信息。本文中所涉及的代码已经上传至 github, 欢迎大家点赞关注,项目 github 地址 springboot-auth

相关推荐
vx-Biye_Design3 小时前
SSM伴侣动物伴护星小程序06330-计算机课程设计、毕业设计
spring boot·后端·elasticsearch·小程序·架构·课程设计·idea
2分钟速写快排4 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
面向Google编程5 小时前
Apache Iceberg Variant 类型:v3 半结构化数据不再「二选一」
大数据·后端
lhldsg5 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都5 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒5 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
辰烨chenye5 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
小羊没烦恼!6 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
小荷才露尖尖角,早有蜻蜓立上头7 小时前
过滤器的4种创建方式
java