Возможность использовать преобразователь?

Используя 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 ответ

Я пойду, но, как и многие из нас, я все еще думаю об этом.

Из моего прочтения о преобразователях кажется, что реальная выгода заключается в том, что нужно избегать создания промежуточных коллекций, тем самым повышая эффективность. Это означает, что для ответа на ваш вопрос вам действительно нужно посмотреть, что будет делать ваш код и какова его структура.

Например, если у вас было что-то вроде

(->> (карта....) (фильтр..) (карта..) (карта..))

функции выполняются в последовательности с новыми коллекциями, создаваемыми после каждой передачи для последующей передачи. Тем не менее, с преобразователями, вы бы получили что-то вроде

(->> (карта...) (карта..) (фильтр..) (карта...))

где функции, применяемые к данным, применяются в виде трубопровода к каждому элементу из исходной коллекции, и вы избегаете необходимости создавать промежуточные коллекции.

В твоем случае я не уверен, что это поможет. Это отчасти потому, что я не знаю, какие другие преобразования вы применяете, но в основном потому, что то, что вы хотите, требует уровня отслеживания состояния, то есть группировки данных о сотрудниках. Это возможно, но я считаю, что это немного усложняет.

Другие вопросы по тегам