gpt4 book ai didi

Java 8 将多个可选参数映射到一个函数中

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:53 24 4
gpt4 key购买 nike

假设我有函数 Object f(String a, String b) 并且我想调用两个返回可选字符串的不同函数来获取 f Optional<String> getA() 的参数 Optional<String> getB() 。我可以想到两种解决方案,但看起来都不那么干净,尤其是当您有更多参数时:

1:

return getA().flatMap(
a -> getB().map(
b -> f(a,b)).get()

2:

Optional<String> a = getA();
Optional<String> b = getB();
if(a.isPresent() && b.isPresent()) {
return f(a.get(), b.get());
}

有没有更简洁的方法来做到这一点?

最佳答案

您刚刚在函数式编程中偶然发现了一个名为提升 的概念,它使您能够提升 常规函数(例如 A -> B )到新域(例如 Optional<A> -> Optional<B> )中。

对于 flatMapping 和映射,还有一种语法糖更舒适,在 Haskell 和类似语言中称为 do 表示法,在 Scala 中称为理解。它为您提供了一种保持流程线性并避免嵌套的方法(您在示例 1 中被迫经历)。

不幸的是,Java 没有这种东西,因为它的函数式编程能力很差,甚至 Optional 也不是真正的一等公民(没有标准 API 实际使用它)。因此,您只能使用已经发现的方法。

如果您对上述概念感到好奇,请继续阅读。

提升

假设您有:

public String f(A a, B b) {
return b + "-" + a;
}

用它的 Scala 等价物:

def f(a: A, b: B) = b + "-" + a

f 提升到 Option(与 Java 中的 Optional 相同)看起来像这样(使用 Scalaz 库,请参阅 Cats 的 here)

val lifted = Monad[Option].lift2(f)

lifted 现在是一个等效于:

public Optional<String> f(Optional<A> a, Optional<B> b) {
if(a.isPresent() && b.isPresent()) {
return Optional.of(b + "-" + a);
}
return Optional.empty;
}

正是您要查找的内容,在 1 行中,适用于任何上下文(例如 List ,而不仅仅是 Option )和任何函数。

为了理解/做标记

使用理解,您的示例将如下所示(我认为,我的 Scala 很弱):

for { 
a <- getA();
b <- getB();
} yield f(a, b)

同样,这适用于任何可以平面映射的对象,例如 ListFuture 等。

关于Java 8 将多个可选参数映射到一个函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55007669/

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