gpt4 book ai didi

java-8 - 对 lambda 的类型推断

转载 作者:行者123 更新时间:2023-12-04 22:45:53 24 4
gpt4 key购买 nike

我一直在转换一些代码以使用 Java 8 功能。在下面的人为例子中

    Arrays.asList("1", "2", "3", "cheese", "5").stream().map(line -> {
try {
return Optional.of(Integer.parseInt(line));
} catch (NumberFormatException xep) {
return Optional.empty();
}
}).forEach( v ->
System.out.println(v.orElse(999))
);

(目的是将一些字符串解析为整数并用 999 替换任何无法解析的值)

编译器报告
error: incompatible types: int cannot be converted to CAP#1
System.out.println(v.orElse(999))
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ? extends Object"

我试过将 999 转换为整数或对象,但没有成功。

看来真正的问题是第一个 lambda 的推断返回类型是 Optional<Object>而不是 Optional<Integer>
如果我这样做
    Arrays.asList("1", "2", "3", "cheese", "5").stream().map(line -> {
Optional<Integer> ans;
try {
ans = Optional.of(Integer.parseInt(line));
} catch (NumberFormatException xep) {
ans = Optional.empty();
}
return ans;
}).forEach( v ->
System.out.println(v.orElse(999))
);

它工作得很好,但没有那么优雅。有没有更好的方法来“引导”编译器到我想要的返回类型?

最佳答案

一个简单的解决方法是使用目标类型:

return Optional.<Integer> empty();

另外我注意到你使用 Integer.parseInt返回 int ,所以你也可以使用 OptionalInt这将解决您的问题并节省拳击操作:
try {
return OptionalInt.of(Integer.parseInt(line));
} catch (NumberFormatException xep) {
return OptionalInt.empty();
}

关于java-8 - 对 lambda 的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com