我有一个这样的List<String>
:
List.of(
"ParamField(paramName=Thomas, paramValue=Admitted)",
"ParamField(paramName=Martin, paramValue=Discarded)",
"ParamField(paramName=Steve, paramValue=Admitted)"
);
我如何迭代列表并解析所有字符串,以便在迭代结束时我可以得到一个包含如下内容的字符串
String s = "Thomas-Admitted;Marting-Discarded;Steve-Admitted";
使用
的简单子字符串和索引ArrayList list=new ArrayList();
List.of(
"ParamField(paramName=Thomas, paramValue=Admitted)",
"ParamField(paramName=Martin, paramValue=Discarded)",
"ParamField(paramName=Steve, paramValue=Admitted)"
).forEach(item->{
list.add(item.substring(21,item.lastIndexOf(","))+"-"+item.substring(item.lastIndexOf("ue=")+3,item.lastIndexOf(")")));
});
String s =list.toString();
Regex
使用正则表达式捕获组很容易实现这一点。您的模式将是"ParamField\(paramName=(.+), paramValue=(.+)\)"
,然后您只需匹配并得到group(1)
和group(2)
。
一旦您提取了它,只需在;
或类似的StringJoiner
上创建字符串。
可以像这样:
Pattern pattern = Pattern.compile("ParamField\(paramName=(.+), paramValue=(.+)\)");
StringJoiner sj = new StringJoiner(";");
for (String paramField : paramFields) {
Matcher matcher = pattern.matcher(paramField);
if (!matcher.find()) {
throw new IllegalArgumentException("Bad input format");
}
String name = matcher.group(1);
String value = matcher.group(2);
sj.add(name + "-" + value);
}
String result = sj.toString();
与OOP理想情况下,您可以使用一些OOP,并在该字符串上使用工厂方法创建一个不错的记录ParamField
,然后使用它的getter。如果你需要做更多的事情,这样更容易继续处理数据。
record ParamField(String name, String value) {
private static Pattern pattern = Pattern.compile(
"ParamField\(paramName=(.+), paramValue=(.+)\)");
static ParamField of(String line) {
Matcher matcher = pattern.matcher(line);
if (!matcher.find()) {
throw new IllegalArgumentException("Bad input format");
}
return new ParamField(matcher.group(1), matcher.group(2));
}
}
使用类似
的用法List<ParamField> paramFields = lines.stream()
.map(ParamField::of)
.toList();
,然后处理该数据。例如,构建字符串:
String result = paramFields.stream()
.map(paramField -> paramField.name() + "-" + paramField.value())
.collect(Collectors.joining(";"));
Enum
如果你需要对数据做更复杂的事情,我建议你更进一步,也把值输入一个enum,例如:
enum ParamValue {
ADMITTED("Admitted"),
DISCARDED("Discarded");
// field, constructor, getter, of-method
}
,这样你就不必再处理原始字符串,而是获得Java所能提供的所有类型安全。
在流API中使用Pattern和Matcher类:
Pattern pattern = Pattern.compile("ParamField\(paramName=(.+), paramValue=(.+)\)");
var result = Stream.of(
"ParamField(paramName=Thomas, paramValue=Admitted)",
"ParamField(paramName=Martin, paramValue=Discarded)",
"ParamField(paramName=Steve, paramValue=Admitted)"
).map(pattern::matcher)
.filter(Matcher::find)
.map(m -> String.format("%s-%s", m.group(1), m.group(2)))
.collect(Collectors.joining(";"));
System.out.println(result);