我想简化代码(例如通过使用 Optionals(
private String formatValue(Object value) {
if (value == null) {
return null;
} else if (value instanceof Date) {
return MyUtils.formatDate((Date)value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
}
return value.toString();
}
值可以是:null
、String
、Date
我会用重载来处理它:
private String formatValue(String value) {
return value;
}
private String formatValue(Date value) {
return MyUtils.formatDate(value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
}
。并修复null
传递它的任何代码。
如果你真的必须处理null
,那么:
private String formatValue(String value) {
return value;
}
private String formatValue(Date value) {
return value == null ? null : MyUtils.formatDate(value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
}
上述工作提供了你在编译时知道你传入的内容的类型,通常是这种情况。但是,如果您必须处理编译时唯一已知的类型是 Object
的可能性,您也可以添加一个Object
版本:
private string formatValue(Object value) {
if (value instanceof Date) {
return this.formatValue((Date)value);
}
return value == null ? null : value.toString();
}
这开始感觉像更多的代码,但它允许正常路径(类型已知(直接进入适当的方法,并且只有在处理动态内容时才会提供此方法Object
。
或者你可以只拥有Object
版本。它的检查并不少,但对我来说似乎更简单、更清晰。
如果你真的想要代码的功能版本,你可以这样做(使用 2 个可选(:
private String formatValue(Object value) {
return Optional.ofNullable(value)
.map(v -> Optional.of(v)
.filter(d -> d instanceof Date)
.map(d -> MyUtils.formatDate((Date) d,
Constant.DATE_FORMAT_YYYYMMDD_HHMMSS))
.orElseGet(() -> v.toString()))
.orElse(null);
}
不过,这很难阅读;所以我个人会保留你的原始版本。
java 8 中的Optional
:
return Optional.ofNullable(value).filter(v -> v instanceof Date || v instanceof String)
.map(v -> v instanceof Date ? MyUtils.formatDate((Date)v, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS : v)
.orElse(null);
对于日期作为日期或字符串之一,无法避免实例。由于 null 不是日期:
if (value instanceof Date) {
value = MyUtils.formatDate((Date)value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
}
return Optional.ofNullable(value).map(String.class::cast);
Object::toString
会更安全,但现在会在错误值上引发快速故障强制转换异常。