我正在使用FunctionalInterface
。我到处都看到了以下代码的多种变体:
int i = str != null ? Integer.parseInt() : null;
我正在寻找以下行为:
int i = Optional.of(str).ifPresent(Integer::parseInt);
但ifPresent
只接受Supplier
,Optional
无法扩展。
我创建了以下FunctionalInterface
:
@FunctionalInterface
interface Do<A, B> {
default B ifNotNull(A a) {
return Optional.of(a).isPresent() ? perform(a) : null;
}
B perform(A a);
}
这允许我这样做:
Integer i = ((Do<String, Integer>) Integer::parseInt).ifNotNull(str);
可以添加更多默认方法来执行
之类的操作LocalDateTime date = (Do<String, LocalDateTime> MyDateUtils::toDate).ifValidDate(dateStr);
它读得很好Do [my function] and return [function return value] if [my condition] holds true for [my input], otherwise null
。
为什么编译器无法推断出A
(String
传递给ifNotNull
)和B
(Integer
parseInt
返回的类型Integer i = ((Do) Integer::parseInt).ifNotNull(str);
})当我执行以下操作时:
{{1}}
这导致:
不兼容的类型:无效的方法引用
答案 0 :(得分:9)
对于您的原始问题可选功能足以处理可为空的值
Integer i = ((Do<String, Integer>) Integer::parseInt).ifNotNull(str);
对于日期示例,它看起来像
Do
关于类型错误
Do
为Do<Object, Object>
接口指定通用参数可以解决问题。问题是只有Integer::parseInt
没有指定类型参数意味着^[1-9][0-9]{6}*$
和{6}*
与此接口不匹配。