Java-lambda推断类型
我在玩弄Java-lambda推断类型,java,lambda,functional-interface,Java,Lambda,Functional Interface,我在玩弄功能界面的用法。我在任何地方都看到了以下代码的多种变体: int i = str != null ? Integer.parseInt() : null; 我正在寻找以下行为: int i = Optional.of(str).ifPresent(Integer::parseInt); 但是ifPresent只接受供应商,可选不能扩展 我创建了以下功能界面: @FunctionalInterface interface Do<A, B> { default B
功能界面的用法。我在任何地方都看到了以下代码的多种变体:
int i = str != null ? Integer.parseInt() : null;
我正在寻找以下行为:
int i = Optional.of(str).ifPresent(Integer::parseInt);
但是ifPresent
只接受供应商
,可选
不能扩展
我创建了以下功能界面
:
@FunctionalInterface
interface Do<A, B> {
default B ifNotNull(A a) {
return Optional.of(a).isPresent() ? perform(a) : null;
}
B perform(A a);
}
这导致:
不兼容类型:方法引用无效
对于最初的问题,Optional足够强大,可以处理可为null的值
Integer i = Optional.ofNullable(str).map(Integer::parseInt).orElse(null);
例如,它看起来像
Date date = Optional.ofNullable(str).filter(MyDateUtils::isValidDate).map(MyDateUtils::toDate).orElse(null);
关于类型错误
Integer i = ((Do<String, Integer>) Integer::parseInt).ifNotNull(str);
Integer i=((Do)Integer::parseInt).ifNotNull(str);
为Do
接口指定泛型参数可以解决一个问题。问题是没有指定类型参数的Do
意味着Do
和Integer::parseInt
与此接口不匹配。太好了,我不知道Optional
的map
功能。谢谢很高兴这有帮助。看看Optional#flatMap
它是最通用的Optional
方法
Integer i = Optional.ofNullable(str).map(Integer::parseInt).orElse(null);
Date date = Optional.ofNullable(str).filter(MyDateUtils::isValidDate).map(MyDateUtils::toDate).orElse(null);
Integer i = ((Do<String, Integer>) Integer::parseInt).ifNotNull(str);