Ric*_*fer 3 dictionary clojure
我在Java中有一个算法来评估输入变量,如果它们不是null,它会进行一些处理并将它与地图相关联.例如:
myMap = new HashMap()
if ( a != null )
myMap.put( "a", process( a ) )
if ( b != null )
myMap.put( "b", process( b ) )
Run Code Online (Sandbox Code Playgroud)
考虑到Clojure通常没有状态如何使用它以惯用的方式表达上面的算法?
还有一个信息是,如果变量为null,则不应评估过程函数,因为它会产生空指针异常.所以像assoc-not-nil之类的东西不会这样做:(
谢谢.
当我想像这样有条件地建立一个结果时,我倾向于转向cond->
(条件线程优先)宏.
user> (let [a 4 b nil]
(cond-> {}
a (assoc a (* a a 42))
b (assoc b (* b b 47 b))))
{4 672}
Run Code Online (Sandbox Code Playgroud)
这从空映射的初始状态开始,{}
然后如果a为真,则它使用表达式的结果作为下一阶段的值,如果它不是真的,它将未更改的值传递给下一阶段.
如果我从一个集合中构建结果然后我用以下函数减少它:
user> (let [data [1 2 3 nil 4 5 nil 6]]
(reduce (fn [result-so-far new-thing]
(if new-thing
(assoc result-so-far
new-thing
(* new-thing 42))
result-so-far))
{}
data))
{1 42, 2 84, 3 126, 4 168, 5 210, 6 252}
Run Code Online (Sandbox Code Playgroud)
或者采取更简单的方法来过滤掉那些不应该首先回答问题的数据,然后减少它而不用担心.