JavaScript模拟java.lang.Optional?

tsa*_*yen 7 javascript java null undefined optional

我正在寻找一个客户端JavaScript库,它允许我使用一些类型的Option类型编写类似于我在其他语言中可以做的代码,例如java.lang.Optional.

我的目标是避免null/ undefined检查客户端代码并使API更加明确.

这是我希望能够编写的API:

var dictionary = {
    key1: 'value1',
    key2: 'value2'
}

function getValue(key){
    var value = dictionary[key];
    if(value !== null && value !== undefined) 
         return Optional.of(value);
    else 
         return Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)

这是客户端代码:

var value = getValue('key3');
if(value.isPresent())
     console.log('got a value: ' + value.get().toUpperCase());
else
     console.log('no value found!');
Run Code Online (Sandbox Code Playgroud)

或者有时:

var value = getValue('unknown key').orElse('default value');
Run Code Online (Sandbox Code Playgroud)

如果我打电话get()Optional.empty()价值,它应该抛出某种Error.如果我叫Optional.of()null或者undefined,它应该奉送.

Ger*_*cke 6

鉴于java.lang.Optional source,自己编写 Optional 实现不应该那么难。

尽管您必须考虑一些差异,即 ieJavascript 区分undefinednull,但您没有泛型这样的概念,并且 map 的 Java 实现被一些人认为是破碎的。尽管如此,它还是很容易实现的。

但是,我自己已经完成了一个实现(optional.js),它适合我的需要,如果您愿意,可以使用它,但它可能无法满足您的所有要求(即of()不会在 undefined 或 null 上引发异常,但get()确实如此)

用我的代码,你的例子就像

function getValue(key){
    return Optional.of(dictionary[key]);
}

var value = getValue('key3');
value.ifPresent(function() {
     console.log('got a value: ' + value.get().toUpperCase());
 });
Run Code Online (Sandbox Code Playgroud)

顺便提一句。像这样的代码

if(value.isPresent())
     console.log('got a value: ' + value.get().toUpperCase());
else
     console.log('no value found!');
Run Code Online (Sandbox Code Playgroud)

不是 Optional 的有效用例,因为您可以轻松地将其替换为空/未定义检查。但是,如果你需要类似的方法filtermapflatMapifPresent,你会从中受益更多了。


Tom*_*ite 5

\n

对于那些在 2021 年仍然对此感兴趣的人。

\n
\n

长话短说:

\n
    \n
  • 始终使用 ES可选链。它以 JavaScript 方式更具语义性和艺术性(也许使用Babel)。喜欢:

    \n
    obj.val?.prop || defaultValue\nobj.val?.[expr]\nobj.arr?.[index]\nobj.func?.(args)\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 使用TypeScript 中的其他Optional包可能支持该类,并且如果您只想深入访问对象属性并不容易

    \n
  • \n
\n

欲了解更多信息:

\n

我尝试用 TypeScript 创建一个大致的Optional类:

\n
obj.val?.prop || defaultValue\nobj.val?.[expr]\nobj.arr?.[index]\nobj.func?.(args)\n
Run Code Online (Sandbox Code Playgroud)\n

在这里你可以看到,当我想使用Optional访问属性时,它会像下面这样写:

\n
Optional.of(dictionary)\n.map((obj)=> {\n  const descriptors = Object.getOwnPropertyDescriptors(obj)\n  // \xe2\x9a\xa0\xef\xb8\x8f when you use like this, it may also cause an error.\n  return descriptors.key1.value\n})\n.orElse(\'defaultValue\')\n\n
Run Code Online (Sandbox Code Playgroud)\n

使用Optional chain会像这样:

\n
dictionary?.key1 || \'defaultValue\'\n
Run Code Online (Sandbox Code Playgroud)\n