List<DocumentMetadata> 取类型为a的所有文件名组成String,文件名加《》

张开发
2026/4/16 16:32:41 15 分钟阅读

分享文章

List<DocumentMetadata> 取类型为a的所有文件名组成String,文件名加《》
ListDocumentMetadata 提取类型为 a 的文件名并加《》假设DocumentMetadata类中有getType()和getFileName()方法以下是几种实现方式方法一Stream API推荐Java 8String result list.stream() .filter(doc - a.equals(doc.getType())) // 过滤类型为 a .map(DocumentMetadata::getFileName) // 提取文件名 .filter(Objects::nonNull) // 过滤 null .map(name - 《 name 》) // 加《》 .collect(Collectors.joining(,)); // 拼接成字符串完整示例import java.util.*; import java.util.stream.*; class DocumentMetadata { private String type; private String fileName; public DocumentMetadata(String type, String fileName) { this.type type; this.fileName fileName; } public String getType() { return type; } public String getFileName() { return fileName; } } public class Example { public static void main(String[] args) { ListDocumentMetadata list Arrays.asList( new DocumentMetadata(a, 文件 1), new DocumentMetadata(b, 文件 2), new DocumentMetadata(a, 文件 3), new DocumentMetadata(a, 文件 4) ); // 提取类型为 a 的文件名加《》并用逗号分隔 String result list.stream() .filter(doc - a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .map(name - 《 name 》) .collect(Collectors.joining(,)); System.out.println(result); // 输出《文件 1》,《文件 3》,《文件 4》 } }方法二传统 for 循环StringBuilder sb new StringBuilder(); for (DocumentMetadata doc : list) { if (a.equals(doc.getType()) doc.getFileName() ! null) { if (sb.length() 0) { sb.append(,); } sb.append(《).append(doc.getFileName()).append(》); } } String result sb.toString();方法三自定义分隔符// 用分号分隔 String result list.stream() .filter(doc - a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .map(name - 《 name 》) .collect(Collectors.joining(;)); // 输出《文件 1》;《文件 3》;《文件 4》 // 用换行分隔 String result list.stream() .filter(doc - a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .map(name - 《 name 》) .collect(Collectors.joining(\n));方法四转成 ListString不拼接// 如果只需要 List 而不是 String ListString fileNames list.stream() .filter(doc - a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .map(name - 《 name 》) .collect(Collectors.toList()); // 输出[《文件 1》, 《文件 3》, 《文件 4》]方法对比方法代码简洁度性能推荐度Stream joining⭐⭐⭐⭐⭐高✅ 首选for StringBuilder⭐⭐⭐最高兼容性好Stream toList⭐⭐⭐⭐高需要 List 时用进阶处理1. 空安全处理list 可能为 nullString result Optional.ofNullable(list) .orElse(Collections.emptyList()) .stream() .filter(doc - a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .map(name - 《 name 》) .collect(Collectors.joining(,));2. 去重文件名String result list.stream() .filter(doc - a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .distinct() // 去重 .map(name - 《 name 》) .collect(Collectors.joining(,));3. 限制数量只取前 N 个String result list.stream() .filter(doc - a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .limit(10) // 只取前 10 个 .map(name - 《 name 》) .collect(Collectors.joining(,));4. 多类型过滤SetString types Set.of(a, b, c); String result list.stream() .filter(doc - types.contains(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .map(name - 《 name 》) .collect(Collectors.joining(,));5. 空结果处理String result list.stream() .filter(doc - a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .map(name - 《 name 》) .collect(Collectors.joining(,)); // 如果结果为空返回默认值 result result.isEmpty() ? 无文件 : result;注意事项问题说明空指针list、type、fileName都可能为 null需判空类型比较使用a.equals(type)避免空指针分隔符根据需求选择,、;、\n等性能大数据量时 Stream 性能略低于 for 循环✅ 最佳实践// 推荐写法安全、简洁、易读 String result Optional.ofNullable(list) .orElse(Collections.emptyList()) .stream() .filter(doc - doc ! null a.equals(doc.getType())) .map(DocumentMetadata::getFileName) .filter(Objects::nonNull) .map(name - 《 name 》) .collect(Collectors.joining(,)); // 空结果处理 if (result.isEmpty()) { result 暂无文件; }推荐使用 Stream API Collectors.joining()代码简洁且功能强大

更多文章