gpt4 book ai didi

java - 返回第一个非空值

转载 作者:IT老高 更新时间:2023-10-28 20:44:30 26 4
gpt4 key购买 nike

我有很多功能:

String first(){}
String second(){}
...
String default(){}

每个都可以返回一个空值,默认值除外。 每个函数可以采用不同的参数。例如,第一个可以不带参数,第二个可以带一个字符串,第三个可以带三个参数,等等。我想做的是这样的:

ObjectUtils.firstNonNull(first(), second(), ..., default());

问题在于,由于函数调用,this 会进行急切评估。在第二个函数之后说,我想提前退出哪里(因为函数调用可能很昂贵,想想 API 调用等)。在其他语言中,您可以执行类似的操作:

return first() || second() || ... || default()

在 Java 中,我知道我可以执行以下操作:

String value;
if (value = first()) == null || (value = second()) == null ...
return value;

由于所有 == null 检查,IMO 的可读性不太好。 ObjectUtils.firstNonNull()首先创建一个集合,然后进行迭代,只要函数被延迟评估就可以了。

建议? (除了做一堆ifs)

最佳答案

String s = Stream.<Supplier<String>>of(this::first, this::second /*, ... */)
.map(Supplier::get)
.filter(Objects::nonNull)
.findFirst()
.orElseGet(this::defaultOne);

它在第一个非空值上停止,否则设置从 defaultOne 返回的值。只要你保持顺序,你就是安全的。当然这需要 Java 8 或更高版本。

它在第一次出现非空值时停止的原因是 Stream处理每一步。 mapintermediate operationfilter 也是如此. findFirst另一边是 short-circuiting terminal operation .所以它继续下一个元素,直到一个匹配过滤器。如果没有元素匹配一个空的可选项,则返回 orElseGet -supplier 被调用。

this::first 等只是方法引用。如果它们是静态的,则将其替换为 YourClassName::first 等。

如果您的方法的签名不同,以下是一个示例:

String s = Stream.<Supplier<String>>of(() -> first("takesOneArgument"),
() -> second("takes", 3, "arguments")
/*, ... */)
.map(Supplier::get)
.filter(Objects::nonNull)
.findFirst()
.orElseGet(this::defaultOne);

请注意 Supplier仅在您对其调用 get 时进行评估。这样你就会得到你的惰性评估行为。您的供应商 lambda 表达式中的方法参数必须是最终的或有效的最终。

关于java - 返回第一个非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280207/

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