Как достать ключ-значение с помощью лямбда (Java8) из строки
Вот максимум что я смог сделать
String msg = "Validation failed for classes [dao.model.messageslog.MessageLog] during persist time for groups [javax.validation.groups.Default, ]\n" +
"List of constraint violations:[\n" +
"\tConstraintViolationImpl{interpolatedMessage='SENDER\"... can contain only not more 50 symbols.\"', propertyPath=sender, rootBeanClass=class .dao.model.messageslog.MessageLog, messageTemplate='SENDER{MessagesLog.size}'}\n" +
"\tConstraintViolationImpl{interpolatedMessage='PARTICIPANT_ID\"... can contain only not more 32 symbols.\"', propertyPath=participantId, rootBeanClass=class dao.model.messageslog.MessageLog, messageTemplate='PARTICIPANT_ID{MessagesLog.size}'}\n";
Stream<String> stream = Arrays.stream(msg.split("\n"))
.filter(s -> s.contains("\t"));
List<String> collect = stream.collect(Collectors.toList());
Как я могу в этих строках ConstraintViolationImpl{ получить значение полей:
interpolatedMessage='SENDER\"... can contain only not more 50 symbols.\",
rootBeanClass=class dao.model.messageslog.MessageLog,
И вывести в колекцию List, вот в таком виде:
message : 'SENDER\"... can contain only not more 50 symbols.\", source : class dao.model.messageslog.MessageLog,
message : 'PARTICIPANT_ID\"... can contain only not more 32 symbols.\" , source : class dao.model.messageslog.MessageLog,
Частичное решение
Stream<String> stream = Arrays.stream(msg.split("\n"))
.filter(s -> s.contains("\t"))
.map(s -> s.replaceAll("^([^\\{]+)\\{", ""))
.map(s -> s.replaceAll("[\"]", ""))
.map(s -> s.replaceAll("=", ":"));
List<String> collect = stream.collect(Collectors.toList());