我知道可以合并相同型別的 Optional。
public static void main(String[] args) {
var foo = Stream.of(Optional.of("a"), Optional.of("b"))
.flatMap(Optional::stream)
.reduce((a, b) -> a "-" b)
.orElse(null);
System.out.println(foo); // prints "a-b"
}
但是,我正在努力合并不同型別的 Optional。
public class Example {
record A(){}
record B(){}
record C(A a, B b){}
public static void main(String[] args) {
var foo = Stream.of(Optional.of(new A()), Optional.of(new B()))
.flatMap(Optional::stream)
.reduce((a, b) -> new C(a, b))
.orElse(null);
System.out.println(foo);
}
}
那不起作用,我得到了錯誤。
型別不匹配:無法從 Example.C 轉換為 capture#1-of ?擴展記錄
我嘗試了不同的型別轉換版本,但到目前為止沒有成功。有任何想法嗎?
編輯:添加更多資訊
這顯然是一個微不足道且非常簡單的例子。在現實生活中我有兩種方法
- 第一個回傳一個 Optional 型別
User - 第二個回傳一個 Optional 型別
Animal
當兩者都成功/不為空時,我想呼叫一個方法myMethod(User user, Animal animal)。所以問題基本上是關于加入/合并兩個選項,然后使用封閉的值。
uj5u.com熱心網友回復:
如果您有固定數量的選項,請使用flatMaps 鏈,以另一個flatMapor結尾map,以便將所有選項映射到Optional<AnotherType>.
在兩個可選的情況下,這看起來像:
Optional<A> aOpt = Optional.of(new A());
Optional<B> bOpt = Optional.of(new B());
Optional<C> c = aOpt.flatMap(a ->
bOpt.map(b ->
new C(a, b)));
您可以將其概括為 n 個選項:
// opt1 to opt5 can all be different types of optionals
opt1.flatMap(a ->
opt2.flatMap(b ->
opt3.flatMap(c ->
opt4.flatMap(d ->
opt5.map(e -> // if f returns another optional, you'd use flatMap here too
f(a, b, c, d, e))))));
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/467932.html
上一篇:在回圈中將滑鼠事件設定為多個標簽
下一篇:org.springframework.web.servlet.config.annotation中的Javamisising庫
