首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Clojure:有没有一种方法可以删除键,但保留它的值

在Clojure中,如果你想要删除一个键但保留其值,你可以使用dissoc函数来移除键值对,然后使用assoc函数将值重新关联到一个新的键上。以下是一个示例:

代码语言:txt
复制
(def my-map {:a 1 :b 2 :c 3})

;; 删除键 :b 并保留其值
(def new-map (let [value (get my-map :b)]
               (-> my-map
                   (dissoc :b)
                   (assoc :new-key value))))

;; 打印新映射
(println new-map)

在这个例子中,:b键被删除,它的值2被保留并关联到了一个新的键:new-key上。最终的新映射将是{:a 1 :c 3 :new-key 2}

这种方法的优势在于它允许你在不丢失数据的情况下重构映射的结构。这在处理复杂的数据转换时非常有用,尤其是在需要重命名键或重新组织数据的情况下。

应用场景可能包括:

  • 数据清洗,其中某些键可能需要被重命名或移除。
  • API响应的转换,可能需要将内部表示转换为外部客户端期望的格式。
  • 状态管理,在应用程序的状态更新中可能需要移动或重命名状态的一部分。

如果你遇到问题,比如在执行这些操作时出现了意外的行为,可能的原因包括:

  • 键不存在于映射中,导致get函数返回nil
  • 新键已经存在于映射中,这将导致原来的值被覆盖。

解决这些问题的方法包括:

  • 在使用get之前检查键是否存在。
  • 确保新键是唯一的,或者在关联新值之前检查新键是否已经存在。

例如,你可以使用contains?函数来检查键是否存在:

代码语言:txt
复制
(def value (if (contains? my-map :b)
             (get my-map :b)
             nil))

这样可以避免在键不存在时尝试获取值导致的错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Clojure 学习入门(18)—— 数据类型

它存储一个键-值对的集合。键和值都可以是任何数据类型的对象,无论是基本数据类型还是其它映射。然而,使用关键字来作为映射的键非常合适,因此它们经常在应用映射的场合被使用。...但是他们依然是映射,因此从各方面来说,你都可以使用相同的方法来取得一个值甚至是添加新的键。当然,新添加的键不会像在结构里定义的键一样有节省内存的优势。...跟普通映射相比,结构映射的唯一限制是,你不能删除一个结构映射里的某个在结构定义里定义了的键。这样错会引发一个错误。 结构映射同时允许你创建十分高效的函数来访问键的值。...普通映射的查找速度绝不慢,但使用结构访问函数,你将可以大大缩短普通键查找过程所花的时间,以适用于那些极端性能敏感场合的应用。 要创建一个结构映射的高性能访问函数,使用 accessor 函数。...在一个Clojure程序的上下文里,使用映射十分不错,因为可以通过普通的方式来操作它们,而不必为不同的类的对象创建操作的方法。 assoc 映射结合函数assoc接收一个映射和一些键/值对作为参数。

2.4K10

Zsh使用指南(转)

这种情况下你只能进入到目录里,对于其他上下文来说并不是太有用.Zsh知道这点,它只给你显示有效的文件目录. ? 他不仅可以帮你匹配目录,而且还可以允许你用方向键进行选取....扩展环境变量 在我们的shell里提供了环境变量.有些时候我们要使用这些变量值或者只是检查一下它们. ? 在Zsh里你可以按 键使这些变量转换成它们所表达的值. ?...kill命令的tab补全 我通常用kill 前先使用ps 命令检查它们的进程号,或者当我确认的时候用pkill 命令,Zsh给你另一种方法. ?...它会列出选项和说明.你也可以用方向键进行选择. 它步进在ls 命令中,他可以.它可以工作在像netstat ,git ,chmod 等大量的命令中....让我们递归的删除在这个项目里的所有Clojure文件. ? 恩.但是我不太确信这个命令.所以让我们按 列出所有文件来代替. ?

2.7K20
  • 几分钟内学习 Clojure

    Clojure 是JVM上的一个LISP语言变种,它比Common Lisp更强调纯函数式编程,但提供了一些STM工具以处理它所引入的状态问题。...Clojure源码托管在:github 在线练习编译环境: himera learnclojure.clj 示例: ; 分号作为注释的开始 ; Clojure 用一种把元素用括号括起来的像列表一样的方式来书写...[1 2 3]) ; => false ; 序列是列表一种逻辑上的接口,可以懒加载. ; "懒" 意味着可以定义无穷序列,就像下面一样: (range 4) ; => (0 1 2 3) (range...; 关键字类似字符串,但是做了一些性能上的优化 (class :a) ; => clojure.lang.Keyword ; Maps 的键可以是任意类型,但是通常推荐使用keywords (def...来调用方法. 或者使用“.方法名"简写的方式 (.

    1.7K40

    Clojure与LispClojure与Lisp

    Lisp 是一种编程语言,以表达性和功能强大著称,但人们通常认为它不太适合应用于一般情况。Clojure 是一种运行在 Java™ 平台上的 Lisp 方言,它的出现彻底改变了这一现状。...对于 大多数人来说,它的语法过于诡异了. Clojure 修正上面的大多数这些问题. 它保留了 lisp 的思想和哲学,并同时清除了过去的很多限制....一种数据类型应该有的功能,它都有。 3 递归 Lisp是第一种支持递归函数的高级语言。 4 变量的动态类型 在Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,而变量本身没有。...如果你创造了一种新语言,其中有car、cdr、cons、quote、cond、atom、eq这样的功能,还有一种把函数写成列表的表示方法,那么在它们的基础上,你完全可以推导出Lisp语言的所有其他部分。...Lisp是一种以表达性和功能强大著称的编程语言,但人们通常认为它不太适合应用于一般情况,而Clojure的出现彻底改变了这一现状。

    1.9K30

    不学函数式设计的3大损失

    图2 失误1:直接返回内部状态增加这个方法,虽然可以方便地获取MovieTheater类的内部状态,便于调试。但后来其他程序员看到这里有一个getter方法,于是就在多线程代码里开始使用。...为了编写并发安全的代码,Java程序员的认知负荷很重。必须小心翼翼。稍有不慎,就会引入难以调试的并发bug。那么有没有一种编程语言,能从根源上避免这两大坑呢?Clojure就是这样一门语言。...高阶函数是指可以接受其他函数作为参数,和/或返回函数作为结果的函数。这个特性使得函数可以被当作普通的值来传递和操作,大大增加了代码的灵活性和表达能力。...只要记住这三条,你就掌握了大部分Clojure语法。Clojure是一种运行在Java虚拟机(JVM)上的函数式编程语言。它强调不可变数据、高阶函数和惰性计算。不可变数据和高阶函数前面都介绍过了。...惰性计算是一种评估策略。在这种策略中,表达式的计算会被推迟到真正需要其结果的时候。这种方法可以避免不必要的计算,提高性能,并允许处理理论上无限大的数据结构。

    43854

    windows搭建clojure开发环境

    文章目录 1、单独运行的clojure 2、安装leiningen 安装方法1: 安装方法2: 3、使用Intellij Idea作为开发IED 4、运行和打包lein项目 5、leiningen构建工具的...关于leiningen,可以学习其中文教程 运行安装好的clojure REPL,不出意外的话会闪退,闪退的话去cmd运行 lein -version 会提示你要先安装,安装命令看提示,但该命令因为有墙基本上都执行不了...这时可以用浏览器打开它的主页,保存网站的证书为cer文件,然后添加到jre的lib/security/cacerts文件中,这个是jre的默认证书仓库。具体步骤参考java的keytool的用法。...(这个翻译我觉的可能有问题,故保留) ;; 不存在src/目录,删除所有.class文件 ;; 为了解决Clojure bug CLJ-322, 可以将其设置为true,或者定义一个正则序列...:clean-non-project-classes true ;; 如果 :clean-non-project-classes 设置为true ;; 你可以设置这个正则,用来保留匹配的

    2.2K10

    深入探究Immutable.js的实现机制(一)

    网上已经有很多文章简单介绍了 Immutable.js 的原理,但大多浅尝辄止,针对 Clojure 或 Go 中持久化数据结构实现的文章倒是有一些。...Immutable.js 部分参考了 Clojure 中的PersistentVector的实现方式,并有所优化和取舍,该系列第一篇的部分内容也是基于它,想了解的可以阅读?...最简单的方法当然是重新生成一颗树: ? 但这样做显然是很低效的,每次操作都需要生成一颗全新的树,既费时又费空间,因而有了如下的优化方案: ?...这其实就是Object.assign,然而这样显然效率很低,有没有更好的方法呢?...vector trie,这是Clojure里使用的一种数据结构,Immutable.js 里的相关实现与其很相似),我们先了解下它的基本结构。

    1.5K20

    Clojure 开发那些事

    作为万里长城的第一步,这篇文章首先如何入门 Clojure 语法,紧接着介绍 Clojure 开发环境搭建,然后介绍使用第三方库时的一些注意点,最后介绍一下常见的测试方法。...语言非常详细的介绍 https://clojuredocs.org/,可以方便查看函数的方法 数据不可变 括号问题适应后,另一个比较挑战的是数据的不可变性,这融合在 Clojure 语言的设计之中,表象就是没有赋值语句了...println,但问题是我们需要把要监控的变量打两次,这在变量比较多的时候比较麻烦,可以采用下面的 spyscope spyscope Spyscope 库可以解决上println的问题,他提供三个reader...,有没有不用修改的呢?...答案是肯定的,clojure.tools.trace,Github 上的 README 比较详细,大家可以可以去了解,我目前在自己的项目里面还没有采用过这个方法。

    1.6K20

    Java扩展Nginx之七:共享内存

    在java内存中用全局变量肯定不行,因为有四个jvm进程都在响应请求,你存到哪个上面都不行 聪明的您应该想到了redis,确实,用redis可以解决此类问题,但如果不涉及多个服务器,而只是单机的nginx...类型的存储,键和值均可以是这四种类型:int,long,String, byte array Tiny Map和Hash Map的区别,用下表来对比展示,可见主要是量化的限制以及使用内存的多少: 特性...16M 受限于操作系统 单个值的大小 64位系统:4G 32位系统:2G 受限于操作系统 entry对象自身所用内存 24 byte 64位系统:40 byte 32位系统:28 byte 您可以基于上述区别来选自使用...可以当做跨进程的分布式锁来使用,只有指定的key不存在的时候才会设置成功,此时返回0,如果返回值不等于0,表示共享内存中已经存在此key了 atomicAddInt确保了原子性,多进程并发的时候,用此方法累加可以确保计算准确...,第一种:即便是多个worker存在,执行底层共享内存操作的进程也只有一个 第二种:欣宸的C语言水平不行,根本没看懂JVM调用C的逻辑,自我感觉这种可能性很大:如果C语言水平可以,欣宸就用C去做nginx

    87740

    125. 精读《深度学习 - 函数式之美》

    比如说 Clojure,它甚至可在两个同时修改同一引用的程序并发运行时,自动重试其中之一,而不需要手动加锁: (import ‘(java.util.concurrent Executors)) (defn...原文介绍 最后,Clojure 还具备计算安全性,计算过程不会修改已有的数据,因此在神经网络的任何一层的原始值都会保留,每层计算都可以独立运行且函数永远幂等。...Haskell 也有独特的优势,它具有类型推断、惰性求值等特性,被认为更适合用于机器学习。 类型推断即 Haskell 类型都是静态的,如果试图赋予错误的类型会报错。...,但 Haskell 可以几乎原汁原味的还原函数定义过程: solve :: Int -> Interger solve 1 = 1 solve 2 = 9 solve 3 = 16 solve n =...通过本文我们可以了解到,函数式的思想与数学表达式思想如出一辙,以写数学公式的思维方式写代码,就是一种较好的函数式编程思路。

    42110

    Java 8的函数式编程学习

    Clojure就是一种不接受可变数据的语言。 不过,也有一些其它语言,通常以函数方式编程,但语言并不强制这一点。Scala就是一个例子,它混和了面向对象和函数式语言。...允许函数作为值,例如: val sqFn = (x: Int) => x * x 同时保留与Java非常接近的类和对象语法。...数组可以包含基本类型、类的实例或者其它数组。 基本类型全部由平台定义,程序员不能定义新的基本类型。 从最早开始,Java的类型系统一直坚持很重要的一点,每一种类型都必须有一个可以被引用的名字。...在Scala中,可以这样写: x : {def bar : String} 记住,Scala在右侧标示变量类型(冒号后面),所以这读起来像是“x是一种类型,它有一个方法bar返回String”。...; }; 右侧的Lambda表达式是个有效的Java 8的值,但其类型是根据左侧值推断的,因此它实际上是Runnable类型的值。

    99770

    Java扩展Nginx之四:远程调试

    nginx-clojure监听的远程debug端口,当浏览器请求触发了java代码的执行时,就会进入断点状态,停留在断点位置,可以看到堆栈和内存中的变量情况,以及单步执行: 关于工具 本篇使用的编码工具是...如果worker_processes配置的值等于1,address=840#{pno}表示远程调试的端口是8401 如果worker_processes配置的值大于1,例如等于3,此时有3个java进程...worker_processes的值等于1,所以只有一个java进程,它的远程调试端口是8401 配置完成后,启动nginx 用postman访问/java,确认可以响应成功,证明nginx和nginx-clojure...,可以操作如下图: 此刻,NginxClojureRT.java已经被下载下来,可以更仔细的阅读和研究nginx-clojure了: 至此,nginx-clojure的远程调试功能演示完毕,各位java...同僚们,如虎添翼的感觉有没有?

    77910

    改善单元测试的新方法|洞见

    这种基于用例的测试方式在开发(包括TDD)过程中十分好用。因为它清晰地定义了输入输出,而且大部分情况下体量都很小、容易理解。 但这样的测试方式也有坏处。 第一点在于测试的意图。...借助test.check,我们在Clojure可以这样表达: 不过,我们把add方法的实现(+ a b)写到了断言里,这几乎丧失了单元测试的基本意义。...很多指导方法保证使用较少的用例做到有效覆盖,比如:等价类、边界值、判定表、因果图、pairwise等等。但是在实际使用过程当中,依然存在问题。...Clojure.spec是Clojure内置的一个新特性,它允许开发人员将数据结构用类型和其他验证条件(例如允许的取值范围)进行封装。...Clojure.spec提供方法很有前景,它可以让开发者在需要的时候,就能从类型和取值范围中获益。 另外,除了Clojure,其它语言也有相应的生成式测试的框架,你不妨在自己的项目中试一试。

    92050

    对 CIDER, Projectile, Prelude 作者 Bozhidar Batsov 的采访

    在编程方面,我是一个不断学习的人,我喜欢使用新的编程语言——现在我正在学习 OCaml 。 你可以在这里了解更多关于我的信息。 你是怎么对它感兴趣的? 假设您的意思是编程 - 通过视频游戏!...尽管如此,我还是发现了有用的个人看板、Getting Things Done 框架的某些方面、保留大量笔记、待办事项、提醒和事件。...我读了一本关于 Emacs 的书,我对它产生了兴趣,剩下的就是历史了。...通过添加合理的默认值和一组精选的软件包,它可以让用户开始运行。您认为从像 Prelude 这样的东西开始更好,还是用户应该先尝试普通的 Emacs,然后再尝试添加他们自己的定制?...我认为大多数人在看到自己的工作对他人很重要时都会感觉很好。 你梦想的设置是什么? MBA 大小的笔记本电脑,具有 MBP 的功率,20 小时的电池续航时间,不发热,无噪音。:D 和两个控制键!

    65220

    【译】深入 Roam 数据结构 —— 为什么 Roam 远不只是一个笔记应用

    (例如:meetings/) Roam Research 是一个全功能型数据库,相信你已经用上了 `` 的查询方法,但其实远不止如此,你还可以问它更多的问题。...Predicates 断言 断言子句可以过滤结果集,只包括断言返回 true 的结果。在 Datalog 中,你可以使用任何 Clojure 函数或 Java 方法作为谓词函数。...你可以用(...)或[...]将其括起来,但常规的做法是用(...)来帮助你的眼睛区分 head 和 body 的规则,也可以区分规则调用(rule invocations)和正常的数据模式(data...你可以将规则看作一种函数,但请记住,这是逻辑编程,因此我们可以使用相同的规则,根据子 entity-id 找到父实体,根据父 entity-id 找到子实体。...出于这个原因,我完全省略了关于(pull ) requests 的讨论 —— 尽管在 roam.json 中的例子中,我将会提到一部分。(pull ?e [*])是一种强大的从数据库中获取数据的方法。

    1.6K10

    《Prometheus监控实战》第13章 监控Tornado

    边车还与父应用程序共享相同的生命周期,与父应用程序一起创建和删除 提示:边车有时也被称为sidekicks ?...在每个数据库中,还有用于键总数、过期键和键的平均TTL的指标,你可以导出这些键的值 代码清单:Redis服务和边车 apiVersion: apps/v1beta2 kind: Deployment...---- 13.4 Tornado Tornado API是一个Clojure应用程序,它使用Ring并在JVM上运行。...应用程序提供了一个API端点,可以购买和销售商品(https://github.com/ring-clojure/ring) 13.4.1 添加Clojure包装器 为了检测应用程序,我们使用了iapetos...我们为item-bought计数器添加了description标签 13.4.3 添加指标 我们现在可以在应用程序上为每个API方法添加函数调用以递增计数器 代码清单:添加指标调用 (defn

    2.2K10

    Java扩展Nginx之六:两大filter

    ,前文的五大handler形成了nginx-clojure开发的基本框架,初步评估已经可以支撑简单的需求开发了,但nginx-clojure并未止步于handler,还提供了丰富的扩展能力,本篇的两大filter...Header Filter header filter顾名思义,是用于header处理的过滤器,它具有如下特点: header filter是location级别的配置,可以开发一个header filter...来对待,将doFilter的返回值立即返回给客户端 官方建议用header filter来动态处理response的header(增加、删除、修改header项) 接下来开发一个header filter...,有个名为isLast的入参,作用是标记当前调用是不是最后一次(true表示最后一次) doFilter方法的返回值与之前的NginxJavaRingHandler.invoke方法类似,是个一维数组,...的具体值是多少并不关心) 再看doFilter方法的返回值的第三个元素filtered_chunk,它可以是以下四种类型之一: File, viz. java.io.File String InputStream

    56130

    如何在Ubuntu 14.04上部署Clojure Web应用程序

    您的服务器上具有sudo访问权限的非root用户帐户,您可以按照这些说明进行设置 第一步 - 创建和打包示例Clojure应用程序 第一步是使用git抓取示例Clojure项目进行部署。...如果您愿意,可以自己学习该教程,而不是克隆此存储库。 Clojure利用JVM来运行其代码,因此您需要编译项目来运行它。...Leiningen是Clojure应用程序的依赖管理和构建自动化工具,可以轻松实现。有两个步骤可以让Leiningen成立。 首先,安装Java。...sudo ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar 该应用程序当前配置为只能通过localhost访问,但您仍然可以确保它启动时没有错误...加载网站后,单击屏幕顶部的“ 添加位置”链接,尝试添加一些数字坐标以确保数据库访问权限正确。例如,您可以为x值添加1,为y值添加2 。

    1.4K00
    领券