java - 是否有与 Clojure 的 if-let 等效的 Java?

标签 java clojure null

Clojure 的 if-let允许您在实际评估函数之前调整函数返回值的绑定(bind)。这使您可以避免像 Java 中的

那样对一个函数求值两次(主要用于空值检查)
 if (somMap.get(ky) != null){
      String val = someMap.get(ky)
      //do something }

在 Java 中是否有类似 if-let 的东西可以让你避免这种事情?

最佳答案

等效? - 不,if-let 条件宏是 Conjure 独有的。

不同的语言使用不同的结构,例如在 Mathematica 中我可以这样写:

g[x_] := 1 /; x > 0
g[x_] := -1 /; x <= 0

最后的条件告诉函数定义是有效的。

Java 不是函数式语言。你可以在 c# 中做几个不同的方面,但它支持 ??运算符、out 和 ref 方法参数、惰性方法体等——而 java 没有。

在 Java 中,您很可能会使用 Google Guava 库(或 Apache commons 或...)和 ImmutableMap。请注意,它不允许 key 能力为 null!

It is preferable mainly for consistency and maintainability of your code.

Java 有空保存类型的概念,但没有强制执行。类似地,Java 在 JDK10 中可以有可为 null 的值类型,但目前没有。


但是我认为在 Java 中执行此操作的正确方法是

String val = somMap.containsKey(ky) ? values.get(ky) : fallback;

并且没有空键或空值。如果你被迫处理空键或空值,那么我认为添加空检查是合理的。为确保程序会失败,您可以使用

Preconditions.checkNotNull(val, "EOW | key [%s] has NULL value", val );

引用:Google guava Precontitions source .

关于java - 是否有与 Clojure 的 if-let 等效的 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33503383/

相关文章:

java - 调用了 paintComponent,但没有显示任何内容

java - 如何在 Set 中添加重复元素?

haskell - Clojure 是否有类似于 Haskell 的美元符号的运算符?

clojure - last of a lazy seq 会评估 clojure 中的所有元素吗?

android - 调用 setDisplayHomeAsUpEnabled() 时 getSupportActionBar() 返回 null

c# - NullReferenceException 未处理,对象引用未设置为对象的实例

java - 无论如何要创建一个指向类成员方法的切入点?

recursion - 迭代过程与递归过程

c++ - 在函数中分配后的空指针

java - 为什么2路径加载JNA库