Existem várias maneiras de obter coisas de um mapa. Alguns deles são uma boa ideia, alguns deles têm suas armadilhas:
O clássico:
(get user :first-name)
(get-in user [:address :street])
A função get é a função padrão para obter coisas de um mapa. Funciona para todos os tipos de dados e também funciona bem com coisas como java.util.HashMap ou registros. A única desvantagem é que é muito difícil de ler / escrever.
Para mapas aninhados, use a função get-in , ela funciona de forma semelhante à função get e funciona bem até mesmo para diferentes tipos de chave (por exemplo : endereço “rua” )
Parece feijão:
(user :first-name)
((user :address) :street)
Um mapa em Clojure também tem função e você pode usá-lo para acessar valores a partir dele. Prós: funciona com todos os tipos de dados e aparências – por exemplo, para caras Java antigos como eu – como usar propriedades de bean. Contras: funciona apenas em mapas Clojure e não em coisas como HashMap ou registros. Lança uma NullPointerException quando o mapa é nulo, portanto, os mapas aninhados são muito feios de manusear.
Usar isso definitivamente não é uma boa ideia – mas para ser honesto, alguns dos meus primeiros códigos Clojure estão repletos dessas coisas.
Menos código
(:first-name user)
(:first-name user "John")
(:street (:address user))
(-> user :address :street)
Isso é para pessoas que desejam digitar menos. Ele também tem boa legibilidade (do meu ponto de vista) e funciona bem – por exemplo, como get – para HashMap ou registros e você também pode fornecer um valor padrão. Há duas coisas a considerar: a) Funciona apenas para palavras-chave eb) é um pouco mais lento para HashMap .
Para mapas aninhados, isso muda um pouco. Os formulários aninhados simples carecem de alguma legibilidade porque você tem que inverter a ordem das chaves, mas com a macro de threading você pode simplesmente evitar isso. Outro bom saber é que é 20-30% mais rápido do que a função get-in (se isso for realmente importante para você).