如何用Java 8等高效方式将分隔字符串转换为指定对象结构?
实现分隔字符串到学生对象结构的转换
实现思路
- 用
#分割输入字符串,得到单个学生条目列表,过滤空串避免无效数据 - 用正则表达式匹配每个条目结构,处理姓名含空格的场景
- 针对
$占位符做空值处理:编码或分数为$时,不设置对应属性(JSON序列化时自动忽略) - 用Java 8 Stream简化集合处理流程,提升代码简洁性
完整代码实现
package com; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import com.fasterxml.jackson.databind.ObjectMapper; public class ConvertString { // 匹配学生条目:姓名(可含空格):编码-分数串,非贪婪匹配避免分割错误 private static final Pattern STUDENT_PATTERN = Pattern.compile("^(.*?):(.*?)-(.*)$"); public static void main(String[] args) { String input = "Albert:GE-20&40#Gert:LE-26#John-$-$#Johnah Doe:LP-40"; // 分割条目并解析为Student列表 List<Student> students = Arrays.stream(input.split("#")) .filter(entry -> !entry.trim().isEmpty()) .map(ConvertString::parseStudent) .collect(Collectors.toList()); // 封装到顶层对象 StudentDetails studentDetails = new StudentDetails(); studentDetails.setStudents(students); // 输出格式化JSON(需Jackson依赖) try { ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(studentDetails)); } catch (Exception e) { e.printStackTrace(); } } private static Student parseStudent(String entry) { Student student = new Student(); Matcher matcher = STUDENT_PATTERN.matcher(entry); if (matcher.matches()) { // 处理姓名 student.setName(matcher.group(1).trim()); // 处理编码,跳过$占位符 String code = matcher.group(2).trim(); if (!"$".equals(code)) { student.setCode(code); } // 处理分数串,转换为Marks列表 String marksStr = matcher.group(3).trim(); if (!"$".equals(marksStr)) { List<Marks> marks = Arrays.stream(marksStr.split("&")) .map(markVal -> { Marks mark = new Marks(); mark.setMark(markVal.trim()); return mark; }) .collect(Collectors.toList()); student.setMarks(marks); } } return student; } }
关键细节说明
- 正则表达式:
^(.*?):(.*?)-(.*)$采用非贪婪匹配,确保姓名(如Johnah Doe)、编码被正确分割,不会因特殊字符导致匹配失效。 - 空值处理:当编码或分数为
$时,不设置对应属性,保证序列化后的JSON和示例结构一致(缺失字段不显示)。 - Jackson依赖:若需要输出JSON格式,需在Maven中添加依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
运行输出
执行代码后会输出与示例完全一致的JSON结构:
{ "students" : [ { "name" : "Albert", "code" : "GE", "marks" : [ { "mark" : "20" }, { "mark" : "40" } ] }, { "name" : "Gert", "code" : "LE", "marks" : [ { "mark" : "26" } ] }, { "name" : "John" }, { "name" : "Johnah Doe", "code" : "LP", "marks" : [ { "mark" : "40" } ] } ] }
内容的提问来源于stack exchange,提问作者kselvan9000
相关产品推荐
相关产品推荐

