Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';s开关在Clojure中的等效值?_Java_Clojure_Language Features_Functional Programming - Fatal编程技术网

Java';s开关在Clojure中的等效值?

Java';s开关在Clojure中的等效值?,java,clojure,language-features,functional-programming,Java,Clojure,Language Features,Functional Programming,Clojure中Java的开关构造是否有等价物?如果是,是什么?如果没有,我们是否必须使用If

Clojure中Java的
开关
构造是否有等价物?如果是,是什么?如果没有,我们是否必须使用
If
梯形图来实现它?

尝试
案例
宏:

(case (+ 2 3)
  6 "error"
  5 "ok")
或使用默认值

(case (+ 2 3)
  5 "ok"
  "error")
请记住,根据文档

不评估测试常数。它们必须是编译时文本,不需要引用。(……)

如Jan所指出的,

是一个很好的选择

在许多相关情况下也非常有用,特别是如果您希望在计算一系列不同条件表达式的基础上进行切换,例如

(defn account-message [balance]
  (cond 
    (< balance 0) "Overdrawn!"
    (< balance 100) "Low balance"
    (> balance 1000000) "Rich as creosote"
    :else "Good balance"))
(defn帐户消息[余额]
(续)
(<余额0)“透支!”
(<余额100)“低余额”
(>余额1000000)“富含杂酚油”
:否则为“良好平衡”)
请注意,cond的结果由第一个匹配表达式确定,因此负余额将显示“Overdrawn!”,即使它也匹配低余额情况


[我已经编辑了代码-删除了结尾处的额外括号以使其正常工作]

尽管@Jan和@mikera使用或(我可以添加到列表中吗?)的建议从功能的角度来看是合理的,尽管
case
的限制(例如,测试值只能是编译时间常数;默认返回值是必需的)与
开关类似,存在一些细微差别:

  • case
    不能与Java
    Enum
    常量一起使用

  • case
    的分派是基于hashing AFAIK的,这使得它在性能上与hashmaps相当<代码>开关
快得多

  • 您不能使用
    case
    ,这意味着您必须使用其他选项(
    condp
    带值集?)来镜像
    开关的行为



  • [1]没有中的功能,功能就像实现一个功能,为一个目的服务。

    如果您的测试值是非文本的,您可能还想查看
    condp
    (condp=(+23)(inc 4)“Ok”(dec 7)“error”)
    @Jan使用clojure的
    case
    会减慢过程(值得注意的时间),还有其他选择吗?@vikbehal,正如米凯拉在回答中指出的那样,还有
    cond
    。我真的很想知道这次经济放缓的原因是什么。你能做一些研究,例如分析,并分享结果吗?很好地参考了Discworld:)注意,
    cond
    将返回
    nil
    ,如果不满足任何条件!