gpt4 book ai didi

java - 通过直接评估 lambda 来初始化变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:37 26 4
gpt4 key购买 nike

我想知道是否有一种方法可以在定义的同一表达式中直接调用 lambda 函数的 .apply().get()。当我想初始化一个可能是私有(private)的变量时,我想到了这个问题,但我不能将它声明为 final,因为该值是可以抛出异常的函数的返回值。例如,考虑 Files.size(path):

 final s = Files.size(path);
// code that uses s

现在,如果我想为 s 使用默认值,如果有异常,我必须添加一个 try/catch,但这是一个声明和不是表达式:

s = 0;
try {
s = Files.size();
}
catch (IOException e) {}

// code that uses s

显而易见的解决方案是只声明一个包装 try/catch 的小辅助函数,例如getFileSizeOrZero。我还可以编写一个通用函数,将其包装为一般情况。这很好并且具有描述性,但是更局部的函数方法会更好。

在 C++ 中,我使用了 lambda:

const s = []() {
try {
return Files.size(path);
} catch (...) {
return 0;
}
}();

所以我想知道这是否可以用 Java 完成。我能想到的最好的办法是

final int s = new IntSupplier() {
@Override
public int getAsInt() {
try {
return Files.size(path);
}
catch (IOException e) {
return 0;
}
}
}.getAsInt();

这似乎很有表现力,所以我希望有一些我不知道启用的语法

final int s = () -> {
try {
return Files.size(path);
}
catch (IOException e) {
return 0;
}
}.apply();

问题似乎是没有像C++中那样的函数调用运算符,所以必须有一个可以调用的命名成员函数。

最佳答案

您可以这样做,但您需要将匿名 lambda 显式转换为正确的类型。那是因为你需要将 lambda 的类型强制转换为特定的功能接口(interface),Java 无法猜测最终类型,例如:

final int x = ((IntSupplier)() -> 5).getAsInt();

如果你不喜欢它,你需要将它存储在一个变量中:

final IntSupplier xx = () -> 5;
final int x = xx.getAsInt();

关于java - 通过直接评估 lambda 来初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47943103/

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