public String getSanitisedMessage() {
Throwable rootCause = context.getRootCauseException();
if(rootCause != null) {
return Optional.ofNullable(rootCause.getMessage())
.map(message -> Stream.of(
// clean message substrings we want to find
"Connection timed out",
"Connection reset",
"Connection was lost",
"FTP Fails"
).filter(subString -> message
.toLowerCase()
.contains(subString.toLowerCase())
).findFirst().orElse("NA")
).orElse("NA");
} else return "NA";
}
目标是检查Throwable
的消息中是否有子字符串,如果找到,则返回子字符串,否则返回NA
。
context.getRootCauseException()
和Throwable.getMessage()
调用都可以返回null
。
答案 0 :(得分:4)
一种可能的方法是将flatMap
与findFirst
一起使用,而不是map
,
// method argument is just for the sake of an example and clarification here
public String getSanitisedMessage(Throwable rootCause, Set<String> primaryCauses) {
return Optional.ofNullable(rootCause)
.map(Throwable::getMessage)
.map(String::toLowerCase)
.flatMap(message -> primaryCauses.stream()
.map(String::toLowerCase)
.filter(message::contains)
.findFirst())
.orElse("NA");
}
或者也可以使用三元运算符将其表示为:
return rootCause == null || rootCause.getMessage() == null ? "NA" :
primaryCauses.stream().map(String::toLowerCase).filter(subString -> rootCause.getMessage()
.toLowerCase().contains(subString)).findFirst().orElse("NA");
答案 1 :(得分:0)
Imo,您应该在这里抛出一个异常,并对其进行正确处理(看来您稍后将检查String)。 如果您要坚持这种方式,则可以向context.getMessage()添加一个默认值(假设这是一个实现Context的自定义类),然后返回其值。
否则,您还可以执行以下操作:
Throwable rootCause = context.getRootCauseException();
if (rootCause != null) {
return Stream.of("Connection timed out",
"Connection reset",
"Connection was lost",
"FTP Fails")
.filter(s -> s.equalsIgnoreCase(rootCause.getMessage()))
.findFirst()
.orElse("NA");
}
return "NA";
}