Возможность использовать преобразователь?
Используя Clojure, я извлекаю некоторые данные из базы данных SQLite. Это прибудет в форме списка карт. Вот сокращенный образец того, как выглядят данные.
(
{:department-id 1 :employee-firstname "Fred" :employee-lastname "Bloggs"}
{:department-id 1 :employee-firstname "Joe" :employee-lastname "Bloggs"}
{:department-id 2 :employee-firstname "John" :employee-lastname "Doe"}
...
)
Я хотел бы преобразовать это в нечто вроде этого:
(
{:department-id 1 :employees [{:employee-firstname "Joe" :employee-lastname "Bloggs"} {:employee-firstname "Fred" :employee-lastname "Bloggs"}]}
{:department-id 2 :employees [{:employee-firstname "John" :employee-lastname "Doe"}]
...
)
Я знаю, что мог бы написать функцию, которая бы работала с отделами, а затем с сотрудниками и "склеивала" их вместе, чтобы достичь желаемой формы. На самом деле я сделал именно это в REPL.
Но я недавно немного слышал о преобразователях и удивился, была ли это возможность использовать один из них.
Если это так, как будет выглядеть код?
1 ответ
Я пойду, но, как и многие из нас, я все еще думаю об этом.
Из моего прочтения о преобразователях кажется, что реальная выгода заключается в том, что нужно избегать создания промежуточных коллекций, тем самым повышая эффективность. Это означает, что для ответа на ваш вопрос вам действительно нужно посмотреть, что будет делать ваш код и какова его структура.
Например, если у вас было что-то вроде
(->> (карта....) (фильтр..) (карта..) (карта..))
функции выполняются в последовательности с новыми коллекциями, создаваемыми после каждой передачи для последующей передачи. Тем не менее, с преобразователями, вы бы получили что-то вроде
(->> (карта...) (карта..) (фильтр..) (карта...))
где функции, применяемые к данным, применяются в виде трубопровода к каждому элементу из исходной коллекции, и вы избегаете необходимости создавать промежуточные коллекции.
В твоем случае я не уверен, что это поможет. Это отчасти потому, что я не знаю, какие другие преобразования вы применяете, но в основном потому, что то, что вы хотите, требует уровня отслеживания состояния, то есть группировки данных о сотрудниках. Это возможно, но я считаю, что это немного усложняет.