我是否认为Java- Optional
与C ++ 17- optional
没有太多关系?
我知道Java Optional
主要是通过在Stream-API中使用,例如:
Optional<Integer> op = Optional.empty();
op.stream().forEach(System.out::println);
我知道它也有作为返回值的用途(与其说是参数,不如说是它的用途)。但是关于这种用法,这不适用于C ++-optional
,对吧?
还是还是“ Monads”,没有人能在理解后解释一下? C ++-optional
是否实际上与Monads都有关系,Java-Streams也是如此,因此C ++--optional
与Java- Optional
相当吗?那么,什么是可比的例子?
[Java和C ++(以及许多其他编程语言)中的可选对象具有相似的目的-表示可能存在或不存在的值。
Java中的可选参数不仅用于流,还可以(并且应该)单独使用它们。话虽这么说,在Java中,可选参数仅应用作可能返回或可能不返回值的方法的返回类型。返回null
值可以实现相同的目的,但是忘记检查返回的值会容易得多。但是,Java中的可选对象不应该只是替换实际上可能不存在的每个对象(例如,例如Haskell中的Maybe
)。
我不是C ++专家,但看起来C ++的optional
具有大致相同的目的(如果我错了,请纠正我)。
我不会解释这里的单子,但是这个概念很简单,我真的不知道为什么这么多人害怕它们。如果您已经阅读了有关monad的任何内容,则知道它们基本上有2种操作:创建monadic值并将其绑定(或平面映射)。
在Java中,Optional.of
创建一个可选值,然后Optional.flatMap
对其进行平面映射。但是这些操作没有完全遵守单子法则,因此纯粹主义者声称Java中的可选不是really单子法。
在C ++中,您可以使用构造函数或make_optional
函数创建一个可选的,因此您可以进行创建操作。但是我在标准库中找不到bind
或flat_map
函数。如果愿意,您可以自己编写-如果该功能符合单子法则,则可选将成为单子法。
我是否认为Java-Optional与C ++ 17-Optional没有太多关系?
它们的相似之处在于,它们为相同的概念建模—可能不存在该值,但是它们的界面却大不相同。我对C ++不太了解,但是从this page来看,我可以看到C ++的std::optional
比Java的Optional
少了很多。或者还是“ Monads”,没有人能在理解后解释一下?
现货! Java的Optional
本质上是monad。通过具有Optional.of
和Optional.flatMap
方法,Java Optional
成为monad。 C ++可选缺少相应的flatMap
方法,这导致它不是monad :(
IMO,std::optional
没有flatMap
方法是这两种类型之间的基础。 flatMap
具有签名:
<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
基本上允许您这里是有关Monad的paper,可能会有所帮助。组成
Optional
秒。您可以拥有一个Optional<String>
,应用一个函数来返回另一个Optional<T>
,然后再获取一个Optional<T>
。