Java中拼接字符串时如何忽略DTO的空值或Null值?
解决Java中DTO空值字段的字符串拼接问题
要实现只保留非空(null或空字符串)的标签和内容,可以用以下几种实用方式:
1. 基础条件判断法
用StringBuilder(单线程场景比StringBuffer更高效)逐个判断字段,仅当值非空时拼接对应标签和内容,最后清理末尾多余的逗号和空格:
StringBuilder sb = new StringBuilder(); // 处理ID字段 String id = someDTO.getId(); if (id != null && !id.isBlank()) { sb.append("<b> test Id </b> ").append(id).append(", "); } // 处理Type字段 String type = someDTO.getType(); if (type != null && !type.isBlank()) { sb.append("<b> Type: </b> ").append(type).append(", "); } // 处理Date字段 String date = someDTO.getDate(); if (date != null && !date.isBlank()) { sb.append("<b> Date: </b> ").append(date).append(", "); } // 移除末尾多余的", " if (sb.length() > 0) { sb.setLength(sb.length() - 2); } String dummyVal = sb.toString(); System.out.println(dummyVal);
2. 提取工具方法简化重复代码
如果需要处理的字段较多,把判断和拼接逻辑抽成工具方法,减少冗余代码:
private static void appendIfPresent(StringBuilder sb, String label, String value) { if (value != null && !value.isBlank()) { sb.append(label).append(value).append(", "); } } // 调用工具方法 StringBuilder sb = new StringBuilder(); appendIfPresent(sb, "<b> test Id </b> ", someDTO.getId()); appendIfPresent(sb, "<b> Type: </b> ", someDTO.getType()); appendIfPresent(sb, "<b> Date: </b> ", someDTO.getDate()); if (sb.length() > 0) { sb.setLength(sb.length() - 2); } String dummyVal = sb.toString(); System.out.println(dummyVal);
3. Java 8+ Stream优雅实现
将标签和字段值封装成键值对,通过Stream过滤非空值后拼接,代码更简洁:
import java.util.AbstractMap.SimpleEntry; import java.util.stream.Collectors; import java.util.stream.Stream; String dummyVal = Stream.of( new SimpleEntry<>("<b> test Id </b> ", someDTO.getId()), new SimpleEntry<>("<b> Type: </b> ", someDTO.getType()), new SimpleEntry<>("<b> Date: </b> ", someDTO.getDate()) ) // 过滤非空值 .filter(entry -> entry.getValue() != null && !entry.getValue().isBlank()) // 拼接单个条目为"标签+值" .map(entry -> entry.getKey() + entry.getValue()) // 用", "连接所有有效条目 .collect(Collectors.joining(", ")); System.out.println(dummyVal);
版本兼容提示
如果使用Java 11以下版本,isBlank()可以替换为!value.trim().isEmpty(),注意必须先判断value不为null,避免空指针异常。
内容的提问来源于stack exchange,提问作者Kesavan Balakrishnan
相关产品推荐
相关产品推荐

