使用ifPresent在Java8中检查空安全对象
我有这个功能:使用ifPresent在Java8中检查空安全对象,java,lambda,java-8,functional-programming,Java,Lambda,Java 8,Functional Programming,我有这个功能: public static long toEpochMilli(OffsetDateTime dateTime) { return dateTime.toInstant().toEpochMilli(); } 我想使用的,但我必须先检查它是否为空 private Long buildBookingValidDate (TimeIntervalType validFor) { return Optional.ofNullable(validFor.get
public static long toEpochMilli(OffsetDateTime dateTime) {
return dateTime.toInstant().toEpochMilli();
}
我想使用的,但我必须先检查它是否为空
private Long buildBookingValidDate (TimeIntervalType validFor) {
return Optional.ofNullable(validFor.getStartTimeStamp())
.ifPresent(DateUtils::toEpochMilli);
}
但是我不知道如何返回值当输入为null时,我建议使用.map并返回可选值,而不是null
例如
当输入是某个值时
下面是它在普通Java中的外观。只是为了比较
private Long buildBookingValidDate (TimeIntervalType validFor) {
if(validFor.getStartTimeStamp() == null)
return null;
return DateUtils.toEpochMilli(validFor.getStartTimeStamp());
}
您误用了Optional-它不是为替换空检查而设计的
如果您仍然不想在您的案例中使用普通的、旧的Java,那么您可以创建一个助手方法,如
static <T, R> R applyIfNotNull(T obj, Function<T, R> function) {
return obj != null ? function.apply(obj) : null;
}
由于您非常喜欢可选,所以可以在applyIfNotNull方法中使用它:
当输入值为null时,首先确定要从此方法返回什么。1。如果可能的话,不要使用NULL,并且在99.9999%的情况下使用NULL。2.不要误用可选类型。使用平淡的旧的,而不是考虑作为返回类型,一般的答案是不检查它;这似乎不是这种方法的责任。允许NPE在这里逃逸似乎是完全合理的,因为管理预订的人应该进行有效性检查。
private Long buildBookingValidDate (TimeIntervalType validFor) {
if(validFor.getStartTimeStamp() == null)
return null;
return DateUtils.toEpochMilli(validFor.getStartTimeStamp());
}
static <T, R> R applyIfNotNull(T obj, Function<T, R> function) {
return obj != null ? function.apply(obj) : null;
}
long time = applyIfNotNull(validFor.getStartTimeStamp(), FooBar::toEpochMilli);
static <T, R> Optional<R> applyIfNotNull(T obj, Function<T, R> function) {
return obj != null ? Optional.of(function.apply(obj)) : Optional.empty();
}