Nic*_*ico 14 java scala optional
我有以下问题.假设你有2个Optional
变量
Optional<Contact> c1 = ...
Optional<Contact> c2 = ...
Run Code Online (Sandbox Code Playgroud)
以及需要2个Contact类型变量的方法
void match(Contact c1, Contact c2) {...}
Run Code Online (Sandbox Code Playgroud)
你需要打开c1和c2 Optional
变量并将它们传递给match()
方法.
我的问题是"在Java 8中哪种方式最优雅?"
到目前为止,我找到了两种方法:
通过使用isPresent
if (c1.isPresent() && c2.isPresent()) {
match(c1.get(), c2.get());
}
Run Code Online (Sandbox Code Playgroud)通过使用嵌套的ifPresent
c1.ifPresent((Contact _c1) -> {
c2.ifPresent((Contact _c2) -> {
match(_c1, _c2);
});
});
Run Code Online (Sandbox Code Playgroud)在我看来,这两种方式都很糟糕.在Scala我可以这样做:
for {
contact1 <- c1
contact2 <- c2
} yield {
match(contact1, contact2);
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法在Java 8中做到比我上面概述的更整洁?
小智 9
您在scala中提供的解决方案只是内部使用flatMaps的语法糖.您也可以在Java 8中使用平面地图(但它没有语法糖).
c1.flatMap(contact1 -> c2.flatMap(contact2 -> match(contact1, contact2)));
Run Code Online (Sandbox Code Playgroud)
它与您提供的解决方案2几乎相同.您还可以使用https://github.com/aol/cyclops-react(我是贡献者之一)或任何其他功能性java 8库中的applicative functor .
应用函子
Optional<String> o3 = Maybe.fromOptional(o1).ap2(String::concat).ap(o2).toOptional();
Run Code Online (Sandbox Code Playgroud)
对于-理解
Do.add(o1)
.add(o2)
.yield(a->b->a.concat(b));
Run Code Online (Sandbox Code Playgroud)
您可以通过以下函数将Scala for-understanding理解为Java 8中的map/flatMap:
public static <T,K,V> Optional<V> map2(Optional<T> opt1, Optional<K> opt2, BiFunction<T, K, V> f) {
Optional<V> result = opt1.flatMap(t1 -> opt2.map(t2 -> f.apply(t1, t2)));
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后传递你的功能匹配
归档时间: |
|
查看次数: |
3562 次 |
最近记录: |