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);